static int query_adc(int mux) { uint8_t buf[2]; uint32_t mux_masked, result = 0; uint64_t startTime; mux_masked = mux & 0xF; result = pmu_get_reg(PMU_ADC_REG); if (mux == 3) { mux_masked |= 0x20; pmu_write_reg(PMU_MUXSEL_REG, mux_masked, 0); udelay(80000); } pmu_write_reg(PMU_MUXSEL_REG, mux_masked | 0x10, 0); startTime = timer_get_system_microtime(); do { udelay(1000); if (has_elapsed(startTime, 50000)) return -1; result = pmu_get_reg(PMU_ADC_REG); } while (!(result & 0x20)); pmu_get_regs(PMU_ADCVAL_REG, buf, 2); pmu_write_reg(PMU_MUXSEL_REG, 0, 0); return (buf[1] << 4) | (buf[0] & 0xF); }
int query_adc(int flags, uint32_t* result) { // clear the done bit if it is set pmu_get_reg(PMU_ADCSTS); // set up flags if (flags == 0x3) { pmu_write_reg(PMU_ADCCON, flags | 0x20, FALSE); udelay(80000); } pmu_write_reg(PMU_ADCCON, flags | 0x10, FALSE); // wait until done uint64_t startTime = timer_get_system_microtime(); while (!(pmu_get_reg(PMU_ADCSTS) & 0x2)) { if (has_elapsed(startTime, 40000)) { return -1; } } uint8_t out[2]; pmu_get_regs(PMU_ADCOUT1, out, 2); *result = (out[1] << 2) | (out[0] & 0x3); return 0; }