Exemple #1
0
static void process(void)
{
    int val;
    switch(touch_state)
    {
    case TOUCH_STATE_WAIT:
        /* a touch has happened, check if it's still valid */
        if(imx233_lradc_read_touch_detect())
            enter_state(TOUCH_STATE_MEASURE_X);
        else
        {
            old_touch_detect = false;
            /* clear detect interrupt */
            imx233_lradc_clear_touch_detect_irq();
        }
        break;
    case TOUCH_STATE_MEASURE_X:
        /* read value */
        val = imx233_lradc_read_channel(touch_chan);
        /* if value is too far from average, restart */
        if(nr_samples > 0 && abs(val - touch_x) > DEBOUNCE_THRESHOLD)
            nr_samples = 0;
        touch_x = (touch_x * nr_samples + val) / (nr_samples + 1);
        nr_samples++;
        /* if we have enough samples, measure Y */
        if(nr_samples > SAMPLES_THRESHOLD)
            enter_state(TOUCH_STATE_MEASURE_Y);
        else
            imx233_lradc_kick_delay(touch_delay);
        break;
    case TOUCH_STATE_MEASURE_Y:
        /* read value */
        val = imx233_lradc_read_channel(touch_chan);
        /* if value is too far from average, restart */
        if(nr_samples > 0 && abs(val - touch_y) > DEBOUNCE_THRESHOLD)
            nr_samples = 0;
        touch_y = (touch_y * nr_samples + val) / (nr_samples + 1);
        nr_samples++;
        /* if we have enough samples, verify touch */
        if(nr_samples > SAMPLES_THRESHOLD)
            enter_state(TOUCH_STATE_VERIFY);
        else
            imx233_lradc_kick_delay(touch_delay);
        break;
    case TOUCH_STATE_VERIFY:
        if(imx233_lradc_read_touch_detect())
        {
            old_touch_detect = true;
            old_touch_x = touch_x;
            old_touch_y = touch_y;
            enter_state(TOUCH_STATE_MEASURE_X);
        }
        else
        {
            old_touch_detect = false;
            enter_state(TOUCH_STATE_WAIT);
        }
        break;
    }
}
Exemple #2
0
int imx233_lradc_sense_ext_temperature(int chan, int sensor)
{
#define EXT_TEMP_ACC_COUNT  5
    /* setup channel */
    imx233_lradc_setup_channel(chan, false, false, 0, sensor);
    /* set current source to 300µA */
    imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__300uA);
    /* read value and accumulate */
    int a = 0;
    for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++)
    {
        imx233_lradc_clear_channel(chan);
        imx233_lradc_kick_channel(chan);
        imx233_lradc_wait_channel(chan);
        a += imx233_lradc_read_channel(chan);
    }
    /* setup channel for small accumulation */
    /* set current source to 20µA */
    imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__20uA);
    /* read value */
    int b = 0;
    for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++)
    {
        imx233_lradc_clear_channel(chan);
        imx233_lradc_kick_channel(chan);
        imx233_lradc_wait_channel(chan);
        b += imx233_lradc_read_channel(chan);
    }
    /* disable sensor current */
    imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__0uA);
    
    return (abs(b - a) / EXT_TEMP_ACC_COUNT) * 1104 / 1000;
}
Exemple #3
0
int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan)
{
    // mux sensors
    __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD;
    imx233_lradc_clear_channel(nmos_chan);
    imx233_lradc_clear_channel(pmos_chan);
    // schedule both channels
    imx233_lradc_kick_channel(nmos_chan);
    imx233_lradc_kick_channel(pmos_chan);
    // wait completion
    imx233_lradc_wait_channel(nmos_chan);
    imx233_lradc_wait_channel(pmos_chan);
    // mux sensors
    __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD;
    // do the computation
    int diff = imx233_lradc_read_channel(nmos_chan) - imx233_lradc_read_channel(pmos_chan);
    // return diff * 1.012 / 4
    return (diff * 1012) / 4000;
}