uint32_t analogRead(uint32_t pin) { uint32_t val = 0; /* allow for channel or pin numbers */ if (pin < 6) pin += A0; PinDescription *p = &g_APinDescription[pin]; /* Disable pull-up and set pin mux for ADC output */ SET_PIN_MODE(p->ulSocPin, ADC_MUX_MODE); SET_PIN_PULLUP(p->ulSocPin,0); /* Reset sequence pointer */ SET_ARC_MASK(ADC_CTRL, ADC_SEQ_PTR_RST); /* Update sequence table */ WRITE_ARC_REG(p->ulAdcChan, ADC_SEQ); /* Reset sequence pointer & start sequencer */ SET_ARC_MASK(ADC_CTRL, ADC_SEQ_PTR_RST | ADC_SEQ_START | ADC_ENABLE); /* Poll for ADC data ready status (DATA_A) */ while((READ_ARC_REG(ADC_INTSTAT) & ADC_INT_DATA_A) == 0); /* Pop the data sample from FIFO to sample register */ SET_ARC_MASK(ADC_SET, ADC_POP_SAMPLE); /* Read sample from sample register */ val = READ_ARC_REG( ADC_SAMPLE); /* Clear the DATA_A status bit */ SET_ARC_MASK( ADC_CTRL, ADC_CLR_DATA_A); return mapResolution(val, ADC_RESOLUTION, _readResolution); }
void variantAdcInit(void) { uint32_t creg; uint32_t saved; /* read creg slave to get current Power Mode */ creg = READ_ARC_REG(AR_IO_CREG_SLV0_OBSR); /* perform power up to "Normal mode w/o calibration" cycle if not already there */ if( (creg & ADC_MODE_MASK) != ADC_NORMAL_WO_CALIB){ /* Protect AR_IO_CREG_MST0_CTRL using lock and unlock of interruptions */ saved = interrupt_lock(); /* Read current CREG master */ creg = READ_ARC_REG(AR_IO_CREG_MST0_CTRL); creg &= ~(ADC_MODE_MASK); /* request ADC to go to Standby mode */ creg |= ADC_STANDBY | ADC_CLOCK_GATE; WRITE_ARC_REG(creg, AR_IO_CREG_MST0_CTRL); interrupt_unlock(saved); /* Poll CREG Slave 0 for Power Mode status = requested status */ while ( (creg = READ_ARC_REG(AR_IO_CREG_SLV0_OBSR) & 0x8) == 0); /* Protect AR_IO_CREG_MST0_CTRL using lock and unlock of interruptions */ saved = interrupt_lock(); creg = READ_ARC_REG(AR_IO_CREG_MST0_CTRL); creg &= ~(ADC_MODE_MASK); /* request ADC to go to Normal mode w/o calibration */ creg |= ADC_NORMAL_WO_CALIB | ADC_CLOCK_GATE; WRITE_ARC_REG(creg, AR_IO_CREG_MST0_CTRL); interrupt_unlock(saved); /* Poll CREG Slave 0 for Power Mode status = requested status */ while ( ((creg = READ_ARC_REG(AR_IO_CREG_SLV0_OBSR)) & 0x8) == 0); } WRITE_ARC_REG(ADC_CLK_ENABLE | ADC_INT_DSB, ADC_CTRL); WRITE_ARC_REG(ADC_CONFIG_SETUP, ADC_SET); WRITE_ARC_REG(ADC_CLOCK_RATIO & ADC_CLK_RATIO_MASK, ADC_DIVSEQSTAT); }
int digitalRead( uint8_t pin ) { if (pin >= NUM_DIGITAL_PINS) return LOW; PinDescription *p = &g_APinDescription[pin]; if (p->ulGPIOType == SS_GPIO) { uint32_t reg = p->ulGPIOBase + SS_GPIO_EXT_PORTA; if (READ_ARC_REG(reg) & (1 << p->ulGPIOId)) return HIGH; } else if (p->ulGPIOType == SOC_GPIO) { uint32_t reg = p->ulGPIOBase + SOC_GPIO_EXT_PORTA; if (MMIO_REG_VAL(reg) & (1 << p->ulGPIOId)) return HIGH; } return LOW; }