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; } }
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; }
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; }