示例#1
0
文件: spear_adc.c 项目: 7799/linux
static int spear_read_raw(struct iio_dev *indio_dev,
			  struct iio_chan_spec const *chan,
			  int *val,
			  int *val2,
			  long mask)
{
	struct spear_adc_info *info = iio_priv(indio_dev);
	u32 status;

	switch (mask) {
	case IIO_CHAN_INFO_RAW:
		mutex_lock(&indio_dev->mlock);

		status = CHANNEL_NUM(chan->channel) |
			AVG_SAMPLE(info->avg_samples) |
			START_CONVERSION | ADC_ENABLE;
		if (info->vref_external == 0)
			status |= VREF_INTERNAL;

		spear_adc_set_status(info, status);
		wait_for_completion(&info->completion); /* set by ISR */
		*val = info->value;

		mutex_unlock(&indio_dev->mlock);

		return IIO_VAL_INT;

	case IIO_CHAN_INFO_SCALE:
		*val = info->vref_external;
		*val2 = DATA_BITS;
		return IIO_VAL_FRACTIONAL_LOG2;
	}

	return -EINVAL;
}
示例#2
0
/*运算式配置变更*/
void DevChannelMath::slotChanConfigChanged()
{
    m_sampleCount = 0;
    m_sample_moving.clear();
    m_math_DelayUpper = 0;
    m_math_DelayDowner = 0;

    if (p_expAnalysis) {
        delete p_expAnalysis;
        p_expAnalysis = NULL;
    }

    //表达式初始化
    if (m_pConfig->expressConfig.expSwtich) {
        QByteArray expArray((const char *)m_pConfig->expressConfig.expExpression);
        if (expArray.isEmpty()) {
            p_expAnalysis = NULL;
        } else {
            p_expAnalysis = new MathExpAnalysis(CHANNEL_NUM(m_chanCoder), expArray);
            if (p_expAnalysis) {
                if (!p_expAnalysis->isExpValid()) {
                    delete p_expAnalysis;
                    p_expAnalysis = NULL;
                }
            } else {
                qDebug("Error: Mem alloc Failed[%s]\n", __func__);
            }
        }
    } else {
        p_expAnalysis = NULL;
    }
}
示例#3
0
文件: max111x.c 项目: CPFL/gxen
/* Interpret a control-byte */
void max111x_write(void *opaque, uint32_t value)
{
    struct max111x_s *s = (struct max111x_s *) opaque;
    int measure, chan;

    /* Ignore the value if START bit is zero */
    if (!(value & CB_START))
        return;

    s->cycle = 0;

    if (!(value & CB_PD1)) {
        s->tb1 = 0;
        return;
    }

    s->tb1 = value;

    if (s->inputs == 8)
        chan = CHANNEL_NUM(value, 1, 0, 2);
    else
        chan = CHANNEL_NUM(value & ~CB_SEL0, 0, 1, 2);

    if (value & CB_SGL)
        measure = s->input[chan] - s->com;
    else
        measure = s->input[chan] - s->input[chan ^ 1];

    if (!(value & CB_UNI))
        measure ^= 0x80;

    s->rb2 = (measure >> 2) & 0x3f;
    s->rb3 = (measure << 6) & 0xc0;

    if (s->interrupt)
        qemu_irq_raise(s->interrupt);
}
示例#4
0
文件: max111x.c 项目: AmesianX/panda
/* Interpret a control-byte */
static void max111x_write(MAX111xState *s, uint32_t value)
{
    int measure, chan;

    /* Ignore the value if START bit is zero */
    if (!(value & CB_START))
        return;

    s->cycle = 0;

    if (!(value & CB_PD1)) {
        s->tb1 = 0;
        return;
    }

    s->tb1 = value;

    if (s->inputs == 8)
        chan = CHANNEL_NUM(value, 1, 0, 2);
    else
        chan = CHANNEL_NUM(value & ~CB_SEL0, 0, 1, 2);

    if (value & CB_SGL)
        measure = s->input[chan] - s->com;
    else
        measure = s->input[chan] - s->input[chan ^ 1];

    if (!(value & CB_UNI))
        measure ^= 0x80;

    s->rb2 = (measure >> 2) & 0x3f;
    s->rb3 = (measure << 6) & 0xc0;

    /* FIXME: When should the IRQ be lowered?  */
    qemu_irq_raise(s->interrupt);
}
示例#5
0
DevChannelMath::DevChannelMath(quint32 chanCoder, QObject *parent) :
    Channel(chanCoder, parent)
{
    MODBUS_REGISTER_MAP *pModbusRegMap;
    quint16 chanType, uninNum, moduleIndex, number;

    chanType = CHANNEL_TYPE(m_chanCoder);           //通道类型
    uninNum = CHANNEL_UNIT(m_chanCoder);           //单元号
    moduleIndex = CHANNEL_MODULE(m_chanCoder);  //卡槽号
    number = CHANNEL_NUM(m_chanCoder) - 1;              //通道号

    Q_ASSERT(chanType==Channel_Type_Math && uninNum==0 && moduleIndex==0 && number<MAIN_UNIT_MATH_CHAN_NUM_PRE);

    pModbusRegMap = const_cast<MODBUS_REGISTER_MAP*>(static_cast<MODBUS_REGISTER_MAP const *>(DevShareMem.constData()));
    m_pData = (float *)&pModbusRegMap->inputReg_MainUnit_Math_Data_Float32[number<<1];
    m_pStatus = &pModbusRegMap->inputReg_MainUnit_Math_Status_Int16[number];
    m_pConfig = &DevConfigPtr->chanMath[number];

    p_calculateData = (float *)&g_originDataMap.inputReg_MainUnit_Math_Data_Float32[number<<1];
    p_chanStatus = &g_originDataMap.inputReg_MainUnit_Math_Status_Int16[number];

    //表达式初始化
    if (m_pConfig->expressConfig.expSwtich) {
        QByteArray expArray((const char *)m_pConfig->expressConfig.expExpression);
        if (expArray.isEmpty()) {
            p_expAnalysis = NULL;
        } else {
            p_expAnalysis = new MathExpAnalysis(number+1, expArray);
            if (p_expAnalysis) {
                if (!p_expAnalysis->isExpValid()) {
                    delete p_expAnalysis;
                    p_expAnalysis = NULL;
                }
            } else {
                qDebug("Error: Mem alloc Failed[%s]\n", __func__);
            }
        }
    } else {
        p_expAnalysis = NULL;
    }

    m_sampleCount = 0;
    m_math_DelayUpper = 0;
    m_math_DelayDowner = 0;
}