V4L/DVB (4766): Add working dib7000m-module
First working version of the dib7000m-driver. This commit also makes the Hauppauge NOVA-T Stick working. Signed-off-by: Francois Kanounnikoff <fkanounnikoff@dibcom.fr> Signed-off-by: Patrick Boettcher <pboettcher@dibcom.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
3cc2e4c3a1
commit
69ea31e7de
|
@ -96,29 +96,97 @@ static int bristol_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
|
/* STK7700P: Hauppauge Nova-T Stick, AVerMedia Volar */
|
||||||
/*
|
static struct dibx000_agc_config stk7700p_dib7000m_agc_config = {
|
||||||
static struct mt2060_config stk7000p_mt2060_config = {
|
BAND_UHF | BAND_VHF, // band_caps
|
||||||
0x60
|
|
||||||
|
/* P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5, P_agc_inv_pwm1=0, P_agc_inv_pwm2=0,
|
||||||
|
* P_agc_inh_dc_rv_est=0, P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=2, P_agc_write=0 */
|
||||||
|
(0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) | (0 << 8) | (3 << 5) | (0 << 4) | (2 << 1) | (0 << 0), // setup
|
||||||
|
|
||||||
|
712, // inv_gain
|
||||||
|
41, // time_stabiliz
|
||||||
|
|
||||||
|
0, // alpha_level
|
||||||
|
118, // thlock
|
||||||
|
|
||||||
|
0, // wbd_inv
|
||||||
|
4095, // wbd_ref
|
||||||
|
0, // wbd_sel
|
||||||
|
0, // wbd_alpha
|
||||||
|
|
||||||
|
42598, // agc1_max
|
||||||
|
17694, // agc1_min
|
||||||
|
45875, // agc2_max
|
||||||
|
2621, // agc2_min
|
||||||
|
0, // agc1_pt1
|
||||||
|
76, // agc1_pt2
|
||||||
|
139, // agc1_pt3
|
||||||
|
52, // agc1_slope1
|
||||||
|
59, // agc1_slope2
|
||||||
|
107, // agc2_pt1
|
||||||
|
172, // agc2_pt2
|
||||||
|
57, // agc2_slope1
|
||||||
|
70, // agc2_slope2
|
||||||
|
|
||||||
|
21, // alpha_mant
|
||||||
|
25, // alpha_exp
|
||||||
|
28, // beta_mant
|
||||||
|
48, // beta_exp
|
||||||
|
|
||||||
|
1, // perform_agc_softsplit
|
||||||
|
{ 0, // split_min
|
||||||
|
107, // split_max
|
||||||
|
51800, // global_split_min
|
||||||
|
24700 // global_split_max
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct dibx000_bandwidth_config stk7700p_dib7000m_mt2060_config = {
|
||||||
|
60000, 30000, // internal, sampling
|
||||||
|
1, 8, 3, 1, 0, // pll_cfg: prediv, ratio, range, reset, bypass
|
||||||
|
0, 0, 1, 1, 0, // misc: refdiv, bypclk_div, IO_CLK_en_core, ADClkSrc, modulo
|
||||||
|
(3 << 14) | (1 << 12) | (524 << 0), // sad_cfg: refsel, sel, freq_15k
|
||||||
|
60258167, // ifreq
|
||||||
|
20452225, // timf
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct dib7000m_config stk7700p_dib7000m_config = {
|
||||||
|
.dvbt_mode = 1,
|
||||||
|
.output_mpeg2_in_188_bytes = 1,
|
||||||
|
.quartz_direct = 1,
|
||||||
|
|
||||||
|
.agc_config_count = 1,
|
||||||
|
.agc = &stk7700p_dib7000m_agc_config,
|
||||||
|
.bw = &stk7700p_dib7000m_mt2060_config,
|
||||||
|
|
||||||
|
.gpio_dir = DIB7000M_GPIO_DEFAULT_DIRECTIONS,
|
||||||
|
.gpio_val = DIB7000M_GPIO_DEFAULT_VALUES,
|
||||||
|
.gpio_pwm_pos = DIB7000M_GPIO_DEFAULT_PWM_POS,
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
|
||||||
static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
|
static int stk7700p_frontend_attach(struct dvb_usb_adapter *adap)
|
||||||
{
|
{
|
||||||
|
struct dib0700_state *st = adap->dev->priv;
|
||||||
/* unless there is no real power management in DVB - we leave the device on GPIO6 */
|
/* unless there is no real power management in DVB - we leave the device on GPIO6 */
|
||||||
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
|
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); msleep(10);
|
||||||
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
|
dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); msleep(10);
|
||||||
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
|
|
||||||
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
|
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); msleep(10);
|
||||||
|
dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); msleep(10);
|
||||||
|
|
||||||
// adap->fe = dib7000m_attach(&adap->dev->i2c_adap, &stk7700p_dib7000m_config, 18);
|
st->mt2060_if1[0] = 1220;
|
||||||
return 0;
|
return (adap->fe = dvb_attach(dib7000m_attach, &adap->dev->i2c_adap, 18, &stk7700p_dib7000m_config)) == NULL ? -ENODEV : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct mt2060_config stk7700p_mt2060_config = {
|
||||||
|
0x60
|
||||||
|
};
|
||||||
|
|
||||||
static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
|
static int stk7700p_tuner_attach(struct dvb_usb_adapter *adap)
|
||||||
{
|
{
|
||||||
// tun_i2c = dib7000m_get_tuner_i2c_master(adap->fe, 1);
|
struct dib0700_state *st = adap->dev->priv;
|
||||||
// return mt2060_attach(adap->fe, tun_i2c, &stk3000p_mt2060_config, if1);
|
struct i2c_adapter *tun_i2c = dib7000m_get_i2c_master(adap->fe, DIBX000_I2C_INTERFACE_TUNER, 1);
|
||||||
return 0;
|
return dvb_attach(mt2060_attach,adap->fe, tun_i2c, &stk7700p_mt2060_config,
|
||||||
|
st->mt2060_if1[0]) == NULL ? -ENODEV : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct usb_device_id dib0700_usb_id_table[] = {
|
struct usb_device_id dib0700_usb_id_table[] = {
|
||||||
|
@ -127,6 +195,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
|
||||||
{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
|
{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_500_2) },
|
||||||
{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
|
{ USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_T_STICK) },
|
||||||
{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
|
{ USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR) },
|
||||||
|
{ USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK7700P_PC) },
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
|
||||||
|
@ -171,7 +240,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
|
||||||
.num_device_descs = 3,
|
.num_device_descs = 3,
|
||||||
.devices = {
|
.devices = {
|
||||||
{ "DiBcom STK7700P reference design",
|
{ "DiBcom STK7700P reference design",
|
||||||
{ &dib0700_usb_id_table[0], NULL },
|
{ &dib0700_usb_id_table[0], &dib0700_usb_id_table[5] },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
},
|
},
|
||||||
{ "Hauppauge Nova-T Stick",
|
{ "Hauppauge Nova-T Stick",
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
#define USB_PID_DIBCOM_MOD3001_COLD 0x0bc6
|
#define USB_PID_DIBCOM_MOD3001_COLD 0x0bc6
|
||||||
#define USB_PID_DIBCOM_MOD3001_WARM 0x0bc7
|
#define USB_PID_DIBCOM_MOD3001_WARM 0x0bc7
|
||||||
#define USB_PID_DIBCOM_STK7700P 0x1e14
|
#define USB_PID_DIBCOM_STK7700P 0x1e14
|
||||||
|
#define USB_PID_DIBCOM_STK7700P_PC 0x1e78
|
||||||
#define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131
|
#define USB_PID_DIBCOM_ANCHOR_2135_COLD 0x2131
|
||||||
#define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
|
#define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0
|
||||||
#define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
|
#define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1
|
||||||
|
|
|
@ -172,6 +172,14 @@ config DVB_DIB3000MC
|
||||||
A DVB-T tuner module. Designed for mobile usage. Say Y when you want
|
A DVB-T tuner module. Designed for mobile usage. Say Y when you want
|
||||||
to support this frontend.
|
to support this frontend.
|
||||||
|
|
||||||
|
config DVB_DIB7000M
|
||||||
|
tristate "DiBcom 7000MA/MB/PA/PB/MC"
|
||||||
|
depends on DVB_CORE && I2C
|
||||||
|
default m if DVB_FE_CUSTOMISE
|
||||||
|
help
|
||||||
|
A DVB-T tuner module. Designed for mobile usage. Say Y when you want
|
||||||
|
to support this frontend.
|
||||||
|
|
||||||
comment "DVB-C (cable) frontends"
|
comment "DVB-C (cable) frontends"
|
||||||
depends on DVB_CORE
|
depends on DVB_CORE
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ obj-$(CONFIG_DVB_TDA8083) += tda8083.o
|
||||||
obj-$(CONFIG_DVB_L64781) += l64781.o
|
obj-$(CONFIG_DVB_L64781) += l64781.o
|
||||||
obj-$(CONFIG_DVB_DIB3000MB) += dib3000mb.o
|
obj-$(CONFIG_DVB_DIB3000MB) += dib3000mb.o
|
||||||
obj-$(CONFIG_DVB_DIB3000MC) += dib3000mc.o dibx000_common.o
|
obj-$(CONFIG_DVB_DIB3000MC) += dib3000mc.o dibx000_common.o
|
||||||
|
obj-$(CONFIG_DVB_DIB7000M) += dib7000m.o dibx000_common.o
|
||||||
obj-$(CONFIG_DVB_MT312) += mt312.o
|
obj-$(CONFIG_DVB_MT312) += mt312.o
|
||||||
obj-$(CONFIG_DVB_VES1820) += ves1820.o
|
obj-$(CONFIG_DVB_VES1820) += ves1820.o
|
||||||
obj-$(CONFIG_DVB_VES1X93) += ves1x93.o
|
obj-$(CONFIG_DVB_VES1X93) += ves1x93.o
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -32,12 +32,13 @@ struct dib7000m_config {
|
||||||
u8 quartz_direct;
|
u8 quartz_direct;
|
||||||
|
|
||||||
u8 input_clk_is_div_2;
|
u8 input_clk_is_div_2;
|
||||||
|
|
||||||
|
int (*agc_control) (struct dvb_frontend *, u8 before);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DEFAULT_DIB7000M_I2C_ADDRESS 18
|
#define DEFAULT_DIB7000M_I2C_ADDRESS 18
|
||||||
|
|
||||||
extern int dib7000m_attach(struct i2c_adapter *i2c_adap, int no_of_demods, u8 default_addr , u8 do_i2c_enum, struct dib7000m_config[], struct dvb_frontend*[]);
|
extern struct dvb_frontend * dib7000m_attach(struct i2c_adapter *i2c_adap, u8 i2c_addr, struct dib7000m_config *cfg);
|
||||||
|
|
||||||
extern struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int);
|
extern struct i2c_adapter * dib7000m_get_i2c_master(struct dvb_frontend *, enum dibx000_i2c_interface, int);
|
||||||
|
|
||||||
/* TODO
|
/* TODO
|
||||||
|
|
|
@ -63,7 +63,7 @@ static int dibx000_i2c_gated_tuner_xfer(struct i2c_adapter *i2c_adap, struct i2c
|
||||||
struct i2c_msg m[2 + num];
|
struct i2c_msg m[2 + num];
|
||||||
u8 tx_open[4], tx_close[4];
|
u8 tx_open[4], tx_close[4];
|
||||||
|
|
||||||
memset(m,0, sizeof(struct i2c_msg) * (2 + num));
|
memset(m,0, sizeof(struct i2c_msg) * (2 + num)),
|
||||||
|
|
||||||
dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER);
|
dibx000_i2c_select_interface(mst, DIBX000_I2C_INTERFACE_TUNER);
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,13 @@ extern void dibx000_exit_i2c_master(struct dibx000_i2c_master *mst);
|
||||||
#define BAND_LBAND 0x01
|
#define BAND_LBAND 0x01
|
||||||
#define BAND_UHF 0x02
|
#define BAND_UHF 0x02
|
||||||
#define BAND_VHF 0x04
|
#define BAND_VHF 0x04
|
||||||
|
#define BAND_SBAND 0x08
|
||||||
|
#define BAND_FM 0x10
|
||||||
|
|
||||||
|
#define BAND_OF_FREQUENCY(freq_kHz) ( (freq_kHz) <= 115000 ? BAND_FM : \
|
||||||
|
(freq_kHz) <= 250000 ? BAND_VHF : \
|
||||||
|
(freq_kHz) <= 863000 ? BAND_UHF : \
|
||||||
|
(freq_kHz) <= 2000000 ? BAND_LBAND : BAND_SBAND )
|
||||||
|
|
||||||
struct dibx000_agc_config {
|
struct dibx000_agc_config {
|
||||||
/* defines the capabilities of this AGC-setting - using the BAND_-defines*/
|
/* defines the capabilities of this AGC-setting - using the BAND_-defines*/
|
||||||
|
@ -129,6 +136,7 @@ enum dibx000_adc_states {
|
||||||
|
|
||||||
/* I hope I can get rid of the following kludge in the near future */
|
/* I hope I can get rid of the following kludge in the near future */
|
||||||
struct dibx000_ofdm_channel {
|
struct dibx000_ofdm_channel {
|
||||||
|
u32 RF_kHz;
|
||||||
u8 Bw;
|
u8 Bw;
|
||||||
s16 nfft;
|
s16 nfft;
|
||||||
s16 guard;
|
s16 guard;
|
||||||
|
@ -138,9 +146,11 @@ struct dibx000_ofdm_channel {
|
||||||
s16 vit_alpha;
|
s16 vit_alpha;
|
||||||
s16 vit_code_rate_hp;
|
s16 vit_code_rate_hp;
|
||||||
s16 vit_code_rate_lp;
|
s16 vit_code_rate_lp;
|
||||||
|
u8 intlv_native;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FEP2DIB(fep,ch) \
|
#define FEP2DIB(fep,ch) \
|
||||||
|
(ch)->RF_kHz = (fep)->frequency / 1000; \
|
||||||
(ch)->Bw = (fep)->u.ofdm.bandwidth; \
|
(ch)->Bw = (fep)->u.ofdm.bandwidth; \
|
||||||
(ch)->nfft = (fep)->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ? -1 : (fep)->u.ofdm.transmission_mode; \
|
(ch)->nfft = (fep)->u.ofdm.transmission_mode == TRANSMISSION_MODE_AUTO ? -1 : (fep)->u.ofdm.transmission_mode; \
|
||||||
(ch)->guard = (fep)->u.ofdm.guard_interval == GUARD_INTERVAL_AUTO ? -1 : (fep)->u.ofdm.guard_interval; \
|
(ch)->guard = (fep)->u.ofdm.guard_interval == GUARD_INTERVAL_AUTO ? -1 : (fep)->u.ofdm.guard_interval; \
|
||||||
|
@ -149,7 +159,8 @@ struct dibx000_ofdm_channel {
|
||||||
(ch)->vit_select_hp = 1; \
|
(ch)->vit_select_hp = 1; \
|
||||||
(ch)->vit_alpha = 1; \
|
(ch)->vit_alpha = 1; \
|
||||||
(ch)->vit_code_rate_hp = (fep)->u.ofdm.code_rate_HP == FEC_AUTO ? -1 : (fep)->u.ofdm.code_rate_HP; \
|
(ch)->vit_code_rate_hp = (fep)->u.ofdm.code_rate_HP == FEC_AUTO ? -1 : (fep)->u.ofdm.code_rate_HP; \
|
||||||
(ch)->vit_code_rate_lp = (fep)->u.ofdm.code_rate_LP == FEC_AUTO ? -1 : (fep)->u.ofdm.code_rate_LP;
|
(ch)->vit_code_rate_lp = (fep)->u.ofdm.code_rate_LP == FEC_AUTO ? -1 : (fep)->u.ofdm.code_rate_LP; \
|
||||||
|
(ch)->intlv_native = 1;
|
||||||
|
|
||||||
#define INIT_OFDM_CHANNEL(ch) do {\
|
#define INIT_OFDM_CHANNEL(ch) do {\
|
||||||
(ch)->Bw = 0; \
|
(ch)->Bw = 0; \
|
||||||
|
|
Loading…
Reference in New Issue