//static int dib7000p_cfg_gpio(struct dib7000p_state *st, uint8_t num, uint8_t dir, uint8_t val)
int dib7000p_cfg_gpio(struct dib7000p_state *st, uint8_t num, uint8_t dir, uint8_t val)
{
	st->gpio_dir = dib7000p_read_word(st, 1029);
	st->gpio_dir &= ~(1 << num);         /* reset the direction bit */
	st->gpio_dir |=  (dir & 0x1) << num; /* set the new direction */
	dib7000p_write_word(st, 1029, st->gpio_dir);

	st->gpio_val = dib7000p_read_word(st, 1030);
	st->gpio_val &= ~(1 << num);          /* reset the direction bit */
	st->gpio_val |=  (val & 0x01) << num; /* set the new value */
	dib7000p_write_word(st, 1030, st->gpio_val);

	return DIB_RETURN_SUCCESS;
}
uint8_t dib7000p_get_gpio_dir(struct dibFrontend *fe, uint8_t num)
{
    struct dib7000p_state *state = fe->demod_priv;
    uint16_t dir = dib7000p_read_word(state, 1029);

    return (dir >> num)&0x1;
}
uint8_t dib7000p_get_gpio(struct dibFrontend *fe, uint8_t num)
{
    struct dib7000p_state *state = fe->demod_priv;
    uint16_t val = dib7000p_read_word(state, 1038);

    return (val >> num)&0x1;
}
示例#4
0
int dib7000p_set_power_mode(struct dib7000p_state *state, enum dib7000p_power_mode mode)
{
    /* by default everything is powered off */
    uint16_t reg_774 = 0x3fff, reg_775 = 0xffff, reg_776 = 0x0007, reg_899  = 0x0003,
        //reg_1280 = (0xfe00) | (dib7000p_read_word(state, 1280) & 0x01ff);
        reg_1280, read_reg_1280;

    read_reg_1280 = dib7000p_read_word(state, 1280);
    read_reg_1280 = read_reg_1280 & 0x01ff;
    reg_1280      = 0xfe00 | read_reg_1280;


    /* now, depending on the requested mode, we power on */
    switch (mode) {
        /* power up everything in the demod */
        case DIB7000P_POWER_ALL:
            reg_774 = 0x0000; reg_775 = 0x0000; reg_776 = 0x0; reg_899 = 0x0; reg_1280 &= 0x01ff;
            break;

        case DIB7000P_POWER_ANALOG_ADC:
            /* dem, cfg, iqc, sad, agc */
            reg_774 &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
            /* nud */
            reg_776 &= ~((1 << 0));
            /* Dout */
            reg_1280 &= ~((1 << 11));
            /* fall through wanted to enable the interfaces */

        /* just leave power on the control-interfaces: GPIO and (I2C or SDIO) */
        case DIB7000P_POWER_INTERFACE_ONLY: /* TODO power up either SDIO or I2C */
            reg_1280 &= ~((1 << 14) | (1 << 13) | (1 << 12) | (1 << 10));
            break;

/* TODO following stuff is just converted from the dib7000-driver - check when is used what */
#if 0
        case DIB7000_POWER_LEVEL_INTERF_ANALOG_AGC:
            /* dem, cfg, iqc, sad, agc */
            reg_774  &= ~((1 << 15) | (1 << 14) | (1 << 11) | (1 << 10) | (1 << 9));
            /* sdio, i2c, gpio */
            reg_1280 &= ~((1 << 13) | (1 << 12) | (1 << 10));
            break;
        case DIB7000_POWER_LEVEL_DOWN_COR4_DINTLV_ICIRM_EQUAL_CFROD:
            reg_774   = 0;
            /* power down: cor4 dintlv equal */
            reg_775   = (1 << 15) | (1 << 6) | (1 << 5);
            reg_776   = 0;
            reg_899   = 0;
            reg_1280 &= 0x01ff;
            break;
        case DIB7000_POWER_LEVEL_DOWN_COR4_CRY_ESRAM_MOUT_NUD:
            reg_774   = 0;
            /* power down: cor4 */
            reg_775   = (1 << 15);
            /* nud */
            reg_776   = (1 <<  0);
            reg_899   = 0;
            reg_1280 &= 0x01ff;
            break;
#endif
    }

    dib7000p_write_word(state,  774,  reg_774);
    dib7000p_write_word(state,  775,  reg_775);
    dib7000p_write_word(state,  776,  reg_776);
    dib7000p_write_word(state,  899,  reg_899);
    dib7000p_write_word(state, 1280, reg_1280);

    return DIB_RETURN_SUCCESS;
}