예제 #1
0
파일: pmu.c 프로젝트: DeanBoro/openiBoot
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);
}
예제 #2
0
파일: pmu.c 프로젝트: kaka22ip/openiBoot
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;
}