From a27d8ad8988726fd023508aa3518d0b615f6e93a Mon Sep 17 00:00:00 2001 From: Hualing Chen Date: Tue, 18 Jul 2017 18:29:48 +0800 Subject: [PATCH] dvb: modify dvb-frontend PD#147721: dvb: modify dvb-frontend some struct and add dvb dts 1. add dvbs dvbt info at frontend 2. add blind cmd 3. add dvb dts Change-Id: I22ab5284e646a17ae060f229bcf7c27ee5b6211f Signed-off-by: Hualing Chen --- arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts | 47 ++++++ arch/arm64/boot/dts/amlogic/mesongxl.dtsi | 19 +++ drivers/media/dvb-core/dvb_frontend.c | 50 +++++- drivers/media/dvb-core/dvb_frontend.h | 7 +- include/uapi/linux/dvb/frontend.h | 230 +++++++++++++++++++++++++--- 5 files changed, 328 insertions(+), 25 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts b/arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts index 6e47baf..6c78fdf9 100644 --- a/arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts +++ b/arch/arm64/boot/dts/amlogic/gxl_p230_2g.dts @@ -1171,6 +1171,47 @@ key-permit = "read","write","del"; }; };//End unifykey +// dvb { +// compatible = "amlogic, dvb"; +// dev_name = "dvb"; +// ts0 = "parallel"; +// ts0_control = <0>; +// ts0_invert = <0>; +// interrupts = <0 23 1 +// 0 5 1 +// 0 53 1 +// 0 19 1 +// 0 25 1 +// 0 18 1 +// 0 24 1>; +// interrupt-names = "demux0_irq", +// "demux1_irq", +// "demux2_irq", +// "dvr0_irq", +// "dvr1_irq", +// "dvrfill0_fill", +// "dvrfill1_flush"; +// pinctrl-names = "p_ts0", "s_ts0"; +// pinctrl-0 = <&dvb_p_ts0_pins>; +// pinctrl-1 = <&dvb_s_ts0_pins>; +// clocks = <&clkc CLKID_DEMUX +// &clkc CLKID_ASYNC_FIFO +// &clkc CLKID_AHB_ARB0 +// &clkc CLKID_HIU_IFACE>; +// clock-names = "demux", "asyncfifo", "ahbarb0", "uparsertop"; +// }; +// dvbfe { +// compatible = "amlogic, dvbfe"; +// dev_name = "dvbfe"; +// dtv_demod0 = "Avl6211"; +// dtv_demod0_i2c_adap_id = <2>; +// dtv_demod0_i2c_addr = <0xc6>; +// dtv_demod0_reset_value = <0>; +// dtv_demod0_reset_gpio = <&gpio GPIODV_14 GPIO_ACTIVE_HIGH>; +// fe0_dtv_demod = <0>; +// fe0_ts = <0>; +// fe0_dev = <0>; +// }; }; &efuse { status = "ok"; @@ -1183,3 +1224,9 @@ &audio_data{ status = "okay"; }; +//&i2c_a { +// status = "disabled"; +//}; +//&i2c_b { +// status = "okay"; +//}; diff --git a/arch/arm64/boot/dts/amlogic/mesongxl.dtsi b/arch/arm64/boot/dts/amlogic/mesongxl.dtsi index 5a4a5a1..0128518 100644 --- a/arch/arm64/boot/dts/amlogic/mesongxl.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesongxl.dtsi @@ -966,6 +966,25 @@ i2c_ao: i2c@c8100500{ /*I2C-AO*/ function = "dmic"; }; }; + dvb_p_ts0_pins: dvb_p_ts0_pins { + tsin_a { + groups = "tsin_sop_a_dv9", + "tsin_d_valid_a_dv10", + "tsin_d0_a_dv0", + "tsin_d1_7_a_dv1_7", + "tsin_clk_a_dv8"; + function = "tsin_a"; + }; + }; + dvb_s_ts0_pins: dvb_s_ts0_pins { + tsin_a { + groups = "tsin_sop_a_dv9", + "tsin_d_valid_a_dv10", + "tsin_clk_a_dv8", + "tsin_d0_a_dv0"; + function = "tsin_a"; + }; + }; }; /* end of pinctrl_periphs */ diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index e142449..eb63d01 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c @@ -217,9 +217,14 @@ static enum dvbv3_emulation_type dvbv3_type(u32 delivery_system) return DVBV3_UNKNOWN; } } - +#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; @@ -250,7 +255,9 @@ 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_get_event(struct dvb_frontend *fe, struct dvb_frontend_event *event, int flags) { @@ -1037,7 +1044,19 @@ static struct dtv_cmds_h dtv_cmds[DTV_MAX_COMMAND + 1] = { _DTV_CMD(DTV_STREAM_ID, 1, 0), _DTV_CMD(DTV_DVBT2_PLP_ID_LEGACY, 1, 0), _DTV_CMD(DTV_LNA, 1, 0), - +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + /*set blind scan cmd*/ + _DTV_CMD(DTV_START_BLIND_SCAN, 1, 0), + _DTV_CMD(DTV_CANCEL_BLIND_SCAN, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_MIN_FRE, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_MAX_FRE, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_MIN_SRATE, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_MAX_SRATE, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_FRE_RANGE, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_FRE_STEP, 1, 0), + _DTV_CMD(DTV_BLIND_SCAN_TIMEOUT, 1, 0), + /*set blind scan cmd end*/ +#endif /* Get */ _DTV_CMD(DTV_DISEQC_SLAVE_REPLY, 0, 1), _DTV_CMD(DTV_API_VERSION, 0, 0), @@ -1492,6 +1511,12 @@ static int dtv_property_process_get(struct dvb_frontend *fe, case DTV_STAT_TOTAL_BLOCK_COUNT: tvp->u.st = c->block_count; break; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + case DTV_DELIVERY_SUB_SYSTEM: + r = 0; + //printk("dvb-core get sub sys\r\n"); + break; +#endif default: dev_dbg(fe->dvb->device, "%s: FE property %d doesn't exist\n", @@ -1795,6 +1820,11 @@ static int dtv_property_process_set(struct dvb_frontend *fe, case DTV_DELIVERY_SYSTEM: r = dvbv5_set_delivery_system(fe, tvp->u.data); break; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + case DTV_DELIVERY_SUB_SYSTEM: + r = 0; + break; +#endif case DTV_VOLTAGE: c->voltage = tvp->u.data; r = dvb_frontend_ioctl_legacy(file, FE_SET_VOLTAGE, @@ -1901,7 +1931,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/drivers/media/dvb-core/dvb_frontend.h b/drivers/media/dvb-core/dvb_frontend.h index fb6e848..a2ad9421f 100644 --- a/drivers/media/dvb-core/dvb_frontend.h +++ b/drivers/media/dvb-core/dvb_frontend.h @@ -791,5 +791,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/frontend.h b/include/uapi/linux/dvb/frontend.h index cca0186..cf8df3d 100644 --- a/include/uapi/linux/dvb/frontend.h +++ b/include/uapi/linux/dvb/frontend.h @@ -27,17 +27,25 @@ #define _DVBFRONTEND_H_ #include +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +#include +#endif enum fe_type { FE_QPSK, FE_QAM, FE_OFDM, - FE_ATSC + FE_ATSC, +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + FE_ANALOG, + FE_DTMB, + FE_ISDBT +#endif }; enum fe_caps { FE_IS_STUPID = 0, - FE_CAN_INVERSION_AUTO = 0x1, + FE_CAN_INVERSION_AUTO = 0x1, FE_CAN_FEC_1_2 = 0x2, FE_CAN_FEC_2_3 = 0x4, FE_CAN_FEC_3_4 = 0x8, @@ -60,15 +68,19 @@ enum fe_caps { FE_CAN_HIERARCHY_AUTO = 0x100000, FE_CAN_8VSB = 0x200000, FE_CAN_16VSB = 0x400000, - FE_HAS_EXTENDED_CAPS = 0x800000, /* We need more bitspace for newer APIs, indicate this. */ +/* We need more bitspace for newer APIs, indicate this. */ + FE_HAS_EXTENDED_CAPS = 0x800000, FE_CAN_MULTISTREAM = 0x4000000, /* frontend supports multistream filtering */ FE_CAN_TURBO_FEC = 0x8000000, /* frontend supports "turbo fec modulation" */ - FE_CAN_2G_MODULATION = 0x10000000, /* frontend supports "2nd generation modulation" (DVB-S2) */ +/* frontend supports "2nd generation modulation" (DVB-S2) */ + FE_CAN_2G_MODULATION = 0x10000000, FE_NEEDS_BENDING = 0x20000000, /* not supported anymore, don't use (frontend requires frequency bending) */ FE_CAN_RECOVER = 0x40000000, /* frontend can recover from a cable unplug automatically */ FE_CAN_MUTE_TS = 0x80000000 /* frontend can stop spurious TS data output */ }; - +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +#define FE_CAN_3_LAYER FE_CAN_MULTISTREAM +#endif struct dvb_frontend_info { char name[128]; enum fe_type type; /* DEPRECATED. Use DTV_ENUM_DELSYS instead */ @@ -102,7 +114,10 @@ struct dvb_diseqc_slave_reply { enum fe_sec_voltage { SEC_VOLTAGE_13, SEC_VOLTAGE_18, - SEC_VOLTAGE_OFF + SEC_VOLTAGE_OFF, +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + SEC_VOLTAGE_ON /*for ISDBT antenna control*/ +#endif }; enum fe_sec_tone_mode { @@ -127,14 +142,21 @@ enum fe_sec_mini_cmd { * to reset DiSEqC, tone and parameters */ enum fe_status { - FE_HAS_SIGNAL = 0x01, - FE_HAS_CARRIER = 0x02, - FE_HAS_VITERBI = 0x04, - FE_HAS_SYNC = 0x08, - FE_HAS_LOCK = 0x10, - FE_TIMEDOUT = 0x20, - FE_REINIT = 0x40, -}; + FE_HAS_SIGNAL = 0x01, /* found something above the noise level */ + FE_HAS_CARRIER = 0x02, /* found a DVB signal */ + FE_HAS_VITERBI = 0x04, /* FEC is stable */ + FE_HAS_SYNC = 0x08, /* found sync bytes */ + FE_HAS_LOCK = 0x10, /* everything's working... */ + FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */ + FE_REINIT = 0x40, /* frontend was reinitialized, */ +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + 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 */ +#endif +}; /* application is recommended to reset */ +/* DiSEqC, tone and parameters */ enum fe_spectral_inversion { INVERSION_OFF, @@ -295,7 +317,9 @@ struct fe_blind_scan_parameters { #define DTV_DVBT2_PLP_ID_LEGACY 43 #define DTV_ENUM_DELSYS 44 - +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +#define DTV_DVBT2_PLP_ID DTV_DVBT2_PLP_ID_LEGACY +#endif /* ATSC-MH */ #define DTV_ATSCMH_FIC_VER 45 #define DTV_ATSCMH_PARADE_ID 46 @@ -333,9 +357,16 @@ struct fe_blind_scan_parameters { /* Blind scan */ #define DTV_START_BLIND_SCAN 71 #define DTV_CANCEL_BLIND_SCAN 72 -#define DTV_BLIND_SCAN_STATUS 73 - -#define DTV_MAX_COMMAND DTV_BLIND_SCAN_STATUS +#define DTV_BLIND_SCAN_MIN_FRE 73 +#define DTV_BLIND_SCAN_MAX_FRE 74 +#define DTV_BLIND_SCAN_MIN_SRATE 75 +#define DTV_BLIND_SCAN_MAX_SRATE 76 +#define DTV_BLIND_SCAN_FRE_RANGE 77 +#define DTV_BLIND_SCAN_FRE_STEP 78 +#define DTV_BLIND_SCAN_TIMEOUT 79 +/* Blind scan end*/ +#define DTV_DELIVERY_SUB_SYSTEM 80 +#define DTV_MAX_COMMAND DTV_DELIVERY_SUB_SYSTEM #else /*!defined(CONFIG_AMLOGIC_DVB_COMPAT)*/ @@ -377,6 +408,9 @@ enum fe_delivery_system { SYS_DVBT2, SYS_TURBO, SYS_DVBC_ANNEX_C, +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + SYS_ANALOG +#endif }; /* backward compatibility */ @@ -507,6 +541,14 @@ struct dtv_property { __u32 reserved1[3]; void *reserved2; } buffer; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + struct { + __u8 data[32]; + __u32 len; + __u32 reserved1[3]; + __u64 reserved; + } reserved; +#endif } u; int result; } __attribute__ ((packed)); @@ -562,6 +604,13 @@ typedef enum fe_pilot fe_pilot_t; typedef enum fe_rolloff fe_rolloff_t; typedef enum fe_delivery_system fe_delivery_system_t; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +enum fe_ofdm_mode { + OFDM_DVBT, + OFDM_DVBT2, +}; +#endif + struct dvb_qpsk_parameters { __u32 symbol_rate; /* symbol rate in Symbols per second */ fe_code_rate_t fec_inner; /* forward error correction (see above) */ @@ -587,15 +636,34 @@ struct dvb_ofdm_parameters { fe_hierarchy_t hierarchy_information; }; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +#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; +}; +#endif + struct dvb_frontend_parameters { - __u32 frequency; /* (absolute) frequency in Hz for DVB-C/DVB-T/ATSC */ - /* intermediate frequency in kHz for DVB-S */ + /* (absolute) frequency in Hz for DVB-C/DVB-T/ATSC */ + __u32 frequency; + /* intermediate frequency in kHz for DVB-S */ fe_spectral_inversion_t inversion; union { struct dvb_qpsk_parameters qpsk; /* DVB-S */ struct dvb_qam_parameters qam; /* DVB-C */ struct dvb_ofdm_parameters ofdm; /* DVB-T */ struct dvb_vsb_parameters vsb; /* ATSC */ +#ifdef CONFIG_AMLOGIC_DVB_COMPAT + struct dvb_analog_parameters analog; +#endif } u; }; @@ -610,6 +678,7 @@ struct dvb_frontend_parameters_ex { struct dvb_qam_parameters qam; /* DVB-C */ struct dvb_ofdm_parameters ofdm; /* DVB-T */ struct dvb_vsb_parameters vsb; /* ATSC */ + struct dvb_analog_parameters analog; /* Add extenstion data here */ } u; }; @@ -625,11 +694,119 @@ struct dvb_frontend_event { fe_status_t status; struct dvb_frontend_parameters parameters; }; +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +/* 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; +}; +#endif /*CONFIG_AMLOGIC_DVB_COMPAT*/ #endif #define FE_SET_PROPERTY _IOW('o', 82, struct dtv_properties) #define FE_GET_PROPERTY _IOR('o', 83, struct dtv_properties) +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +/*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; +}; + + +enum fe_layer { + Layer_A_B_C, + Layer_A, + Layer_B, + Layer_C, +}; + +// 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*/ +}; +#endif /*CONFIG_AMLOGIC_DVB_COMPAT*/ /** * When set, this flag will disable any zigzagging or other "normal" tuning * behaviour. Additionally, there will be no automatic monitoring of the lock @@ -663,4 +840,17 @@ struct dvb_frontend_event { #define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */ +#ifdef CONFIG_AMLOGIC_DVB_COMPAT +/*need del this ioctl, used set PROPERTY instead*/ +#define FE_SET_DELAY _IO('o', 100) +#define FE_READ_AFC _IOR('o', 91, __u32) +#define FE_FINE_TUNE _IOW('o', 92, __u32) +#define FE_READ_TUNER_STATUS _IOR('o', 93, struct tuner_status_s) +#define FE_READ_ANALOG_STATUS _IOR('o', 94, struct atv_status_s) +#define FE_READ_SD_STATUS _IOR('o', 95, struct sound_status_s) +/*set & get the tuner parameters only atv*/ +#define FE_SET_PARAM_BOX _IOWR('o', 97, struct tuner_param_s) +#define FE_SET_AFC _IOW('o', 98, __u32) +#endif /*CONFIG_AMLOGIC_DVB_COMPAT*/ + #endif /*_DVBFRONTEND_H_*/ -- 2.7.4