/* Sigma-delta only on the ESP8266 */
#ifdef __ESP8266__

#include "driver/sigma_delta.h"
#include "esp8266/gpio_register.h"


void sigma_delta_setup( void )
{
    GPIO_REG_WRITE(GPIO_SIGMA_DELTA,
                   GPIO_SIGMA_DELTA_SET(GPIO_SIGMA_DELTA_ENABLE) |
                   GPIO_SIGMA_DELTA_TARGET_SET(0x00) |
                   GPIO_SIGMA_DELTA_PRESCALE_SET(0x00));
}

void sigma_delta_stop( void )
{
    GPIO_REG_WRITE(GPIO_SIGMA_DELTA,
                   GPIO_SIGMA_DELTA_SET(GPIO_SIGMA_DELTA_DISABLE) |
                   GPIO_SIGMA_DELTA_TARGET_SET(0x00) |
                   GPIO_SIGMA_DELTA_PRESCALE_SET(0x00) );
}

void sigma_delta_set_prescale_target( sint16 prescale, sint16 target )
{
    uint32_t prescale_mask, target_mask;

    prescale_mask = prescale >= 0 ? GPIO_SIGMA_DELTA_PRESCALE_MASK : 0x00;
    target_mask   = target   >= 0 ? GPIO_SIGMA_DELTA_TARGET_MASK   : 0x00;

    // set prescale and target with one register access to avoid glitches
    GPIO_REG_WRITE(GPIO_SIGMA_DELTA,
                   (GPIO_REG_READ(GPIO_SIGMA_DELTA) & ~(prescale_mask | target_mask)) |
                   (GPIO_SIGMA_DELTA_PRESCALE_SET(prescale) & prescale_mask) |
                   (GPIO_SIGMA_DELTA_TARGET_SET(target) & target_mask));
}

#endif
