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