mirror of
https://github.com/DigitalDevices/dddvb.git
synced 2023-10-10 13:37:43 +02:00
improved PLL setup for modulator
This commit is contained in:
parent
f6c7586815
commit
28a2aaa653
@ -310,9 +310,8 @@ int ddbridge_mod_output_start(struct ddb_output *output)
|
|||||||
u32 Symbolrate = mod->symbolrate;
|
u32 Symbolrate = mod->symbolrate;
|
||||||
u32 ctrl;
|
u32 ctrl;
|
||||||
|
|
||||||
mod_calc_rateinc(mod);
|
if (dev->link[0].info->version < 3)
|
||||||
/*PCRIncrement = RoundPCR(PCRIncrement);*/
|
mod_calc_rateinc(mod);
|
||||||
/*PCRDecrement = RoundPCR(PCRDecrement);*/
|
|
||||||
|
|
||||||
mod->LastInPacketCount = 0;
|
mod->LastInPacketCount = 0;
|
||||||
mod->LastOutPacketCount = 0;
|
mod->LastOutPacketCount = 0;
|
||||||
@ -415,12 +414,55 @@ static int mod_write_max2871(struct ddb *dev, u32 val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u8 max2871_fsm[6] = {
|
||||||
|
0x00730040, 0x600080A1, 0x510061C2, 0x010000CB, 0x6199003C, 0x60440005,
|
||||||
|
};
|
||||||
|
|
||||||
|
static u8 max2871_sdr[6] = {
|
||||||
|
0x007A8098, 0x600080C9, 0x510061C2, 0x010000CB, 0x6199003C, 0x60440005
|
||||||
|
};
|
||||||
|
|
||||||
|
static int mod_setup_max2871_2(struct ddb *dev, u8 *reg)
|
||||||
|
{
|
||||||
|
int status = 0;
|
||||||
|
int i, j;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
ddbwritel(dev, MAX2871_CONTROL_CE, MAX2871_CONTROL);
|
||||||
|
msleep(30);
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
for (j = 5; j >= 0; j--) {
|
||||||
|
val = reg[j];
|
||||||
|
|
||||||
|
if (j ==4)
|
||||||
|
val &= 0xFFFFFEDF;
|
||||||
|
status = mod_write_max2871(dev, reg[j]);
|
||||||
|
if (status)
|
||||||
|
break;
|
||||||
|
msleep(30);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (status == 0) {
|
||||||
|
u32 ControlReg;
|
||||||
|
|
||||||
|
if (reg[3] & (1 << 24))
|
||||||
|
msleep(100);
|
||||||
|
ControlReg = ddbreadl(dev, MAX2871_CONTROL);
|
||||||
|
|
||||||
|
if ((ControlReg & MAX2871_CONTROL_LOCK) == 0)
|
||||||
|
status = -EIO;
|
||||||
|
status = mod_write_max2871(dev, reg[4]);
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static int mod_setup_max2871(struct ddb *dev)
|
static int mod_setup_max2871(struct ddb *dev)
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ddbwritel(dev, MAX2871_CONTROL_CE, MAX2871_CONTROL);
|
ddbwritel(dev, MAX2871_CONTROL_CE, MAX2871_CONTROL);
|
||||||
|
msleep(30);
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
status = mod_write_max2871(dev, 0x00440005);
|
status = mod_write_max2871(dev, 0x00440005);
|
||||||
if (status)
|
if (status)
|
||||||
@ -441,11 +483,11 @@ static int mod_setup_max2871(struct ddb *dev)
|
|||||||
if (status)
|
if (status)
|
||||||
break;
|
break;
|
||||||
msleep(30);
|
msleep(30);
|
||||||
} while(0);
|
}
|
||||||
|
|
||||||
if (status == 0) {
|
if (status == 0) {
|
||||||
u32 ControlReg = ddbreadl(dev, MAX2871_CONTROL);
|
u32 ControlReg = ddbreadl(dev, MAX2871_CONTROL);
|
||||||
|
|
||||||
if ((ControlReg & MAX2871_CONTROL_LOCK) == 0)
|
if ((ControlReg & MAX2871_CONTROL_LOCK) == 0)
|
||||||
status = -EIO;
|
status = -EIO;
|
||||||
}
|
}
|
||||||
@ -461,7 +503,7 @@ static int mod_fsm_setup(struct ddb *dev, u32 FrequencyPlan, u32 MaxUsedChannels
|
|||||||
u32 tmp = ddbreadl(dev, FSM_STATUS);
|
u32 tmp = ddbreadl(dev, FSM_STATUS);
|
||||||
|
|
||||||
if ((tmp & FSM_STATUS_READY) == 0) {
|
if ((tmp & FSM_STATUS_READY) == 0) {
|
||||||
status = mod_setup_max2871(dev);
|
status = mod_setup_max2871_2(dev, max2871_fsm);
|
||||||
if (status)
|
if (status)
|
||||||
return status;
|
return status;
|
||||||
ddbwritel(dev, FSM_CMD_RESET, FSM_CONTROL);
|
ddbwritel(dev, FSM_CMD_RESET, FSM_CONTROL);
|
||||||
@ -1484,8 +1526,6 @@ void ddbridge_mod_rate_handler(unsigned long data)
|
|||||||
|
|
||||||
static int mod_prop_proc(struct ddb_mod *mod, struct dtv_property *tvp)
|
static int mod_prop_proc(struct ddb_mod *mod, struct dtv_property *tvp)
|
||||||
{
|
{
|
||||||
struct ddb *dev = mod->port->dev;
|
|
||||||
|
|
||||||
switch(tvp->cmd) {
|
switch(tvp->cmd) {
|
||||||
case MODULATOR_SYMBOL_RATE:
|
case MODULATOR_SYMBOL_RATE:
|
||||||
return mod_set_symbolrate(mod, tvp->u.data);
|
return mod_set_symbolrate(mod, tvp->u.data);
|
||||||
@ -1597,6 +1637,11 @@ static int mod_init_2(struct ddb *dev, u32 Frequency)
|
|||||||
dev->mod_base.frequency = Frequency;
|
dev->mod_base.frequency = Frequency;
|
||||||
status = mod_fsm_setup(dev, 0, 0);
|
status = mod_fsm_setup(dev, 0, 0);
|
||||||
|
|
||||||
|
if (status) {
|
||||||
|
pr_err("FSM setup failed!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < streams; i++) {
|
for (i = 0; i < streams; i++) {
|
||||||
struct ddb_mod *mod = &dev->mod[i];
|
struct ddb_mod *mod = &dev->mod[i];
|
||||||
|
|
||||||
@ -1618,10 +1663,13 @@ static int mod_init_2(struct ddb *dev, u32 Frequency)
|
|||||||
|
|
||||||
static int mod_init_3(struct ddb *dev, u32 Frequency)
|
static int mod_init_3(struct ddb *dev, u32 Frequency)
|
||||||
{
|
{
|
||||||
int status, i;
|
int status, i, ret = 0;
|
||||||
|
|
||||||
//printk("%s\n", __func__);
|
mod_set_vga(dev, 64);
|
||||||
return 0;
|
ret = mod_setup_max2871_2(dev, max2871_sdr);
|
||||||
|
if (ret)
|
||||||
|
pr_err("DDBridge: PLL setup failed\n");
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ddbridge_mod_init(struct ddb *dev)
|
int ddbridge_mod_init(struct ddb *dev)
|
||||||
|
Loading…
Reference in New Issue
Block a user