/* * Set GPIO mode to output. Optionally in RAM helper because interrupts are dsabled */ static void NO_INTR_CODE set_gpio_no_interrupt(uint8 pin, uint8_t push_pull) { unsigned pnum = pin_num[pin]; ETS_GPIO_INTR_DISABLE(); #ifdef GPIO_INTERRUPT_ENABLE pin_int_type[pin] = GPIO_PIN_INTR_DISABLE; #endif PIN_FUNC_SELECT(pin_mux[pin], pin_func[pin]); //disable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(pnum), GPIO_PIN_INTR_DISABLE); //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(pnum)); // configure push-pull vs open-drain if (push_pull) { GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pnum)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pnum))) & (~ GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE))); //disable open drain; } else { GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pnum)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pnum))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //enable open drain; } ETS_GPIO_INTR_ENABLE(); }
/****************************************************************************** * FunctionName : i2c_master_gpio_init * Description : config SDA and SCL gpio to open-drain output mode, * mux and gpio num defined in i2c_master.h * Parameters : NONE * Returns : NONE *******************************************************************************/ void ICACHE_FLASH_ATTR i2c_master_gpio_init(uint8 scl, uint8 sda, uint32 bitrate) { pinSCL = scl; pinSDA = sda; #if 0 ETS_GPIO_INTR_DISABLE(); // ETS_INTR_LOCK(); // Assume the pin mux is set before calling this function //PIN_FUNC_SELECT(I2C_MASTER_SDA_MUX, I2C_MASTER_SDA_FUNC); //PIN_FUNC_SELECT(I2C_MASTER_SCL_MUX, I2C_MASTER_SCL_FUNC); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(sda)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(sda))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << sda)); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(scl)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(scl))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << scl)); I2C_MASTER_SDA_SCL(1, 1); ETS_GPIO_INTR_ENABLE() ; // ETS_INTR_UNLOCK(); #endif I2C_MASTER_SDA_SCL(1, 1); i2c_master_init(); }
void ICACHE_FLASH_ATTR i2c_init(void) { // MUX selection PIN_FUNC_SELECT(SDA_MUX, SDA_FUNC); PIN_FUNC_SELECT(SCL_MUX, SCL_FUNC); // Set SDA as OD output GPIO_REG_WRITE ( GPIO_PIN_ADDR(GPIO_ID_PIN(SDA_PIN)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(SDA_PIN))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE) ); // Set SCK as OD output GPIO_REG_WRITE ( GPIO_PIN_ADDR(GPIO_ID_PIN(SCL_PIN)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(SCL_PIN))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE) ); // Set idle bus high _SDA1; _SCL1; // Set both output GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | SDA_BIT | SCL_BIT); return; }
/****************************************************************************** * FunctionName : i2c_master_gpio_init * Description : config SDA and SCL gpio to open-drain output mode, * mux and gpio num defined in i2c_master.h * Parameters : uint8 sda and scl pin numbers * Returns : bool, true if init okay *******************************************************************************/ bool i2c_master_gpio_init(uint8 sda, uint8 scl) { if((sda > GPIO_PIN_NUM) || (pin_func[sda] == GPIO_PIN_FUNC_INVALID)){ return false; } if((scl > GPIO_PIN_NUM) || (pin_func[scl] == GPIO_PIN_FUNC_INVALID)){ return false; } pinSDA = sda; pinSCL = scl; ETS_GPIO_INTR_DISABLE() ; // ETS_INTR_LOCK(); PIN_FUNC_SELECT(pin_mux[sda], pin_func[sda]); PIN_FUNC_SELECT(pin_mux[scl], pin_func[scl]); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(sda)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(sda))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << sda)); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(scl)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(scl))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << scl)); i2c_master_setDC(1, 1); ETS_GPIO_INTR_ENABLE() ; // ETS_INTR_UNLOCK(); i2c_master_init(); return true; }
/** * I2C init function * This sets up the GPIO io */ void ICACHE_FLASH_ATTR i2c_init(void) { //Disable interrupts ETS_GPIO_INTR_DISABLE(); //Set pin functions PIN_FUNC_SELECT(I2C_SDA_MUX, I2C_SDA_FUNC); PIN_FUNC_SELECT(I2C_SCK_MUX, I2C_SCK_FUNC); //Set SDA as open drain GPIO_REG_WRITE( GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_SDA_PIN)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_SDA_PIN))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE) ); GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_SDA_PIN)); //Set SCK as open drain GPIO_REG_WRITE( GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_SCK_PIN)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_SCK_PIN))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE) ); GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_SCK_PIN)); //Turn interrupt back on ETS_GPIO_INTR_ENABLE(); i2c_sda(1); i2c_sck(1); return; }
static void gpio_irq(struct nu_gpio_irq_var *var) { uint32_t port_index = var->irq_n - GPA_IRQn; GPIO_T *gpio_base = NU_PORT_BASE(port_index); uint32_t intsrc = gpio_base->INTSRC; uint32_t inten = gpio_base->INTEN; while (intsrc) { int pin_index = nu_ctz(intsrc); gpio_irq_t *obj = var->obj_arr[pin_index]; if (inten & (GPIO_INT_RISING << pin_index)) { if (GPIO_PIN_ADDR(port_index, pin_index)) { if (obj->irq_handler) { ((gpio_irq_handler) obj->irq_handler)(obj->irq_id, IRQ_RISE); } } } if (inten & (GPIO_INT_FALLING << pin_index)) { if (! GPIO_PIN_ADDR(port_index, pin_index)) { if (obj->irq_handler) { ((gpio_irq_handler) obj->irq_handler)(obj->irq_id, IRQ_FALL); } } } intsrc &= ~(1 << pin_index); } // Clear all interrupt flags gpio_base->INTSRC = gpio_base->INTSRC; }
/*---------------------------------------------------------------------------------------------------------*/ void GeneratePORT2Counter(uint32_t u32Pin, uint32_t u32Counts) { while(u32Counts--) { GPIO_PIN_ADDR(2, u32Pin) = 1; GPIO_PIN_ADDR(2, u32Pin) = 0; } }
void dht_init(void) { PIN_FUNC_SELECT(DHT_DQ_MUX, DHT_DQ_FUNC); GPIO_REG_WRITE( GPIO_PIN_ADDR( GPIO_ID_PIN(DHT_GPIO_DQ)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(DHT_GPIO_DQ))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << DHT_GPIO_DQ)); _dht_reset_dq(); }
void gpio_config(GPIO_ConfigTypeDef *pGPIOConfig) { uint32 gpio_pin_mask = pGPIOConfig->GPIO_Pin; uint32 gpio_pin_mask_high = pGPIOConfig->GPIO_Pin_high; uint32 io_reg; uint8 io_num = 0; uint32 pin_reg; uint32 bit_valid; if (pGPIOConfig->GPIO_Mode == GPIO_Mode_Input) { GPIO_AS_INPUT(gpio_pin_mask); GPIO_AS_INPUT_HIGH(gpio_pin_mask_high); } else if (pGPIOConfig->GPIO_Mode == GPIO_Mode_Output) { GPIO_AS_OUTPUT(gpio_pin_mask); GPIO_AS_OUTPUT_HIGH(gpio_pin_mask_high); } do { bit_valid = (io_num >= 32 ? (gpio_pin_mask_high & (0x1 << (io_num - 32))) : (gpio_pin_mask & (0x1 << io_num))); if (bit_valid && (io_reg = GPIO_PIN_REG[io_num])) { if (pGPIOConfig->GPIO_Mode == GPIO_Mode_Input) { SET_PERI_REG_MASK(io_reg, FUN_IE); } //for ESP32 function 2 of every pad is allways GPIO func PIN_FUNC_SELECT(io_reg, 2); if (pGPIOConfig->GPIO_Pullup) { PIN_PULLUP_EN(io_reg); } else { PIN_PULLUP_DIS(io_reg); } if (pGPIOConfig->GPIO_Pulldown) { PIN_PULLDWN_EN(io_reg); } else { PIN_PULLDWN_DIS(io_reg); } if (pGPIOConfig->GPIO_Mode == GPIO_Mode_Out_OD) { portENTER_CRITICAL(); pin_reg = GPIO_REG_READ(GPIO_PIN_ADDR(io_num)); //pin_reg &= (~GPIO_GPIO_PIN0_PAD_DRIVER); pin_reg |= GPIO_GPIO_PIN0_PAD_DRIVER; GPIO_REG_WRITE(GPIO_PIN_ADDR(io_num), pin_reg); portEXIT_CRITICAL(); } gpio_pin_intr_state_set(io_num, pGPIOConfig->GPIO_IntrType); } io_num++; } while (io_num < GPIO_PIN_COUNT); }
void ICACHE_FLASH_ATTR registerInterrupt(int pin, GPIO_INT_TYPE mode) { portENTER_CRITICAL(); // disable open drain GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin))) & (~ GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE))); //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(pin)); // set the mode gpio_pin_intr_state_set(GPIO_ID_PIN(pin), mode); portEXIT_CRITICAL(); }
void ICACHE_FLASH_ATTR dhgpio_open_drain(unsigned int pin_mask_set_od, unsigned int pin_mask_unset_od) { int i; for(i = 0; i <= DHGPIO_MAXGPIONUM; i++) { unsigned int pin = 1 << i; if(pin & DHGPIO_SUITABLE_PINS == 0) continue; if(pin & pin_mask_set_od) { const unsigned int reg = GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(i))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(i)), reg); } else if (pin & pin_mask_unset_od) { const unsigned int reg = GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(i))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(i)), reg); } } }
void gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state) { uint32 pin_reg; portENTER_CRITICAL(); pin_reg = GPIO_REG_READ(GPIO_PIN_ADDR(i)); pin_reg &= (~GPIO_PIN_INT_TYPE_MASK); pin_reg |= (intr_state << GPIO_PIN_INT_TYPE_LSB); pin_reg &= (~GPIO_GPIO_PIN0_INT_ENA); pin_reg |= (BIT(2) << GPIO_GPIO_PIN0_INT_ENA_S); GPIO_REG_WRITE(GPIO_PIN_ADDR(i), pin_reg); portEXIT_CRITICAL(); }
/****************************************************************************** * FunctionName : key_init * Description : init keys * Parameters : key_param *keys - keys parameter, which inited by key_init_single * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR key_init() { uint8 i; ETS_GPIO_INTR_ATTACH(key_intr_handler, &key_parameters); ETS_GPIO_INTR_DISABLE(); for (i = 0; i < key_parameters.key_num; i++) { key_parameters.single_key[i]->key_level = 1; key_parameters.single_key[i]->is_long = 0; PIN_FUNC_SELECT(key_parameters.single_key[i]->gpio_name, key_parameters.single_key[i]->gpio_func); // Set GPIO as input gpio_output_set(0, 0, 0, GPIO_ID_PIN(key_parameters.single_key[i]->gpio_id)); gpio_register_set( GPIO_PIN_ADDR(key_parameters.single_key[i]->gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE) ); //clear gpio14 status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(key_parameters.single_key[i]->gpio_id)); //enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(key_parameters.single_key[i]->gpio_id), GPIO_PIN_INTR_NEGEDGE); } ETS_GPIO_INTR_ENABLE(); }
/** * Sets the 'gpio_pin' pin as a GPIO and sets the interrupt to trigger on that pin. * The 'interruptArg' is the function argument that will be sent to your interruptHandler */ bool ICACHE_FLASH_ATTR easygpio_attachInterrupt(uint8_t gpio_pin, EasyGPIO_PullStatus pullStatus, void (*interruptHandler)(void *arg), void *interruptArg) { uint32_t gpio_name; uint8_t gpio_func; if (gpio_pin == 16) { os_printf("easygpio_setupInterrupt Error: GPIO16 does not have interrupts\n"); return false; } if (!easygpio_getGPIONameFunc(gpio_pin, &gpio_name, &gpio_func) ) { return false; } ETS_GPIO_INTR_ATTACH(interruptHandler, interruptArg); ETS_GPIO_INTR_DISABLE(); PIN_FUNC_SELECT(gpio_name, gpio_func); easygpio_setupPullsByName(gpio_name, pullStatus); // disable output GPIO_DIS_OUTPUT(gpio_pin); gpio_register_set(GPIO_PIN_ADDR(gpio_pin), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear gpio14 status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(gpio_pin)); ETS_GPIO_INTR_ENABLE(); return true; }
/****************************************************************************** * FunctionName : key_init * Description : init keys * Parameters : key_param *keys - keys parameter, which inited by key_init_single * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR key_init(struct keys_param *keys) { uint8 i; os_printf("-%s-%s \r\n", __FILE__, __func__); ETS_GPIO_INTR_ATTACH(key_intr_handler, keys); ETS_GPIO_INTR_DISABLE(); for (i = 0; i < keys->key_num; i++) { keys->single_key[i]->key_level = 1; PIN_FUNC_SELECT(keys->single_key[i]->gpio_name, keys->single_key[i]->gpio_func); gpio_output_set(0, 0, 0, GPIO_ID_PIN(keys->single_key[i]->gpio_id)); gpio_register_set(GPIO_PIN_ADDR(keys->single_key[i]->gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear gpio14 status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(keys->single_key[i]->gpio_id)); //enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(keys->single_key[i]->gpio_id), GPIO_PIN_INTR_ANYEGDE); } ETS_GPIO_INTR_ENABLE(); }
void gpio_pin_wakeup_disable(void) { uint8 i; uint32 pin_reg; for (i = 0; i < GPIO_PIN_COUNT; i++) { pin_reg = GPIO_REG_READ(GPIO_PIN_ADDR(i)); if (pin_reg & GPIO_PIN_WAKEUP_ENABLE_MASK) { pin_reg &= (~GPIO_PIN_INT_TYPE_MASK); pin_reg |= (GPIO_PIN_INTR_DISABLE << GPIO_PIN_INT_TYPE_LSB); pin_reg &= ~(GPIO_PIN_WAKEUP_ENABLE_SET(GPIO_WAKEUP_ENABLE)); GPIO_REG_WRITE(GPIO_PIN_ADDR(i), pin_reg); } } }
/* only highlevel and lowlevel intr can use for wakeup */ void gpio_pin_wakeup_enable(uint32 i, GPIO_INT_TYPE intr_state) { uint32 pin_reg; if ((intr_state == GPIO_PIN_INTR_LOLEVEL) || (intr_state == GPIO_PIN_INTR_HILEVEL)) { portENTER_CRITICAL(); pin_reg = GPIO_REG_READ(GPIO_PIN_ADDR(i)); pin_reg &= (~GPIO_PIN_INT_TYPE_MASK); pin_reg |= (intr_state << GPIO_PIN_INT_TYPE_LSB); pin_reg |= GPIO_PIN_WAKEUP_ENABLE_SET(GPIO_WAKEUP_ENABLE); GPIO_REG_WRITE(GPIO_PIN_ADDR(i), pin_reg); portEXIT_CRITICAL(); } }
void ICACHE_FLASH_ATTR buttons_init() { //Attach the interrupt thing ETS_GPIO_INTR_ATTACH(rotary_intr_handler,12); //Disable interrupts ETS_GPIO_INTR_DISABLE(); //Set GPIO to IO PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); //Set the GPIO to input gpio_output_set(0, 0, 0, GPIO_ID_PIN(12)); gpio_output_set(0, 0, 0, GPIO_ID_PIN(13)); gpio_output_set(0, 0, 0, GPIO_ID_PIN(0)); //Not sure what this does gpio_register_set(GPIO_PIN_ADDR(12), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); gpio_register_set(GPIO_PIN_ADDR(13), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); gpio_register_set(GPIO_PIN_ADDR(0), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear gpio status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(12)); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(13)); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(0)); //re-enable gpio0 interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(12), GPIO_PIN_INTR_ANYEDGE); //Global re-enable interrupts ETS_GPIO_INTR_ENABLE(); os_timer_disarm(&button_timer); os_timer_setfn(&button_timer, (os_timer_func_t *)button_push, 1); os_timer_arm(&button_timer, 50, 1); }
uint8_t platform_sigma_delta_close( uint8_t pin ) { if (pin < 1 || pin > NUM_GPIO) return 0; sigma_delta_stop(); // set GPIO input mode for this pin platform_gpio_mode( pin, PLATFORM_GPIO_INPUT, PLATFORM_GPIO_PULLUP ); // CONNECT GPIO TO PIN PAD GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin])), (GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin]))) &(~GPIO_PIN_SOURCE_MASK)) | GPIO_PIN_SOURCE_SET( GPIO_AS_PIN_SOURCE )); return 1; }
uint8_t platform_sigma_delta_setup( uint8_t pin ) { if (pin < 1 || pin > NUM_GPIO) return 0; sigma_delta_setup(); // set GPIO output mode for this pin platform_gpio_mode( pin, PLATFORM_GPIO_OUTPUT, PLATFORM_GPIO_FLOAT ); platform_gpio_write( pin, PLATFORM_GPIO_LOW ); // enable sigma-delta on this pin GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin])), (GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin]))) &(~GPIO_PIN_SOURCE_MASK)) | GPIO_PIN_SOURCE_SET( SIGMA_AS_PIN_SOURCE )); return 1; }
irom static void gpio_init_i2c(gpio_t *gpio) { uint32_t pin = GPIO_PIN_ADDR(GPIO_ID_PIN(gpio->index)); /* set to open drain */ GPIO_REG_WRITE(pin, GPIO_REG_READ(pin) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); gpio_output_set(1 << gpio->index, 0, 1 << gpio->index, 0); }
static void NO_INTR_CODE set_gpio_interrupt(uint8 pin) { ETS_GPIO_INTR_DISABLE(); PIN_FUNC_SELECT(pin_mux[pin], pin_func[pin]); GPIO_DIS_OUTPUT(pin_num[pin]); gpio_register_set(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin])), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); ETS_GPIO_INTR_ENABLE(); }
/****************************************************************************** * FunctionName : i2c_master_gpio_init * Description : config SDA and SCL gpio to open-drain output mode, * mux and gpio num defined in i2c_master.h * Parameters : NONE * Returns : NONE *******************************************************************************/ void ICACHE_FLASH_ATTR i2c_master_gpio_init(void) { ETS_GPIO_INTR_DISABLE() ; // ETS_INTR_LOCK(); PIN_FUNC_SELECT(I2C_MASTER_SDA_MUX, I2C_MASTER_SDA_FUNC); PIN_FUNC_SELECT(I2C_MASTER_SCL_MUX, I2C_MASTER_SCL_FUNC); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SDA_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SDA_GPIO)); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(I2C_MASTER_SCL_GPIO))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); //open drain; GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << I2C_MASTER_SCL_GPIO)); I2C_MASTER_SDA_HIGH_SCL_HIGH(); ETS_GPIO_INTR_ENABLE() ; // ETS_INTR_UNLOCK(); i2c_master_init(); }
void mp_hal_pin_config_od(mp_hal_pin_obj_t pin_id) { const pyb_pin_obj_t *pin = &pyb_pin_obj[pin_id]; if (pin->phys_port == 16) { // configure GPIO16 as input with output register holding 0 WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | 1); WRITE_PERI_REG(RTC_GPIO_CONF, READ_PERI_REG(RTC_GPIO_CONF) & ~1); WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & ~1)); // input WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & ~1)); // out=0 return; } ETS_GPIO_INTR_DISABLE(); PIN_FUNC_SELECT(pin->periph, pin->func); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin->phys_port)), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin->phys_port))) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE)); // open drain GPIO_REG_WRITE(GPIO_ENABLE_ADDRESS, GPIO_REG_READ(GPIO_ENABLE_ADDRESS) | (1 << pin->phys_port)); ETS_GPIO_INTR_ENABLE(); }
void supla_esp_gpio_enable_input_port(char port) { gpio_output_set(0, 0, 0, GPIO_ID_PIN(port)); gpio_register_set(GPIO_PIN_ADDR(port), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(port)); gpio_pin_intr_state_set(GPIO_ID_PIN(port), GPIO_PIN_INTR_ANYEDGE); }
/****************************************************************************** * FunctionName : user_plug_set_status * Description : set plug's status, 0x00 or 0x01 * Parameters : uint8 - status * Returns : none *******************************************************************************/ void ICACHE_FLASH_ATTR user_plug_set_status(bool status) { // if (status != plug_param.status) { // if (status > 1) { // os_printf("error status input!\n"); // return; // } // // plug_param.status = status; // PLUG_STATUS_OUTPUT(PLUG_RELAY_LED_IO_NUM, status); // } if (status != plug_param.status) { if (status > 1) { os_printf("error status input!\n"); return; } plug_param.status = status; //PLUG_STATUS_OUTPUT(PLUG_RELAY_LED_IO_NUM, status); ETS_GPIO_INTR_DISABLE(); PIN_FUNC_SELECT(pin_mux[pin], pin_func[pin]); GPIO_DIS_OUTPUT(pin_num[pin]); gpio_register_set(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[pin])), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); ETS_GPIO_INTR_ENABLE(); //disable global interrupt ETS_GPIO_INTR_DISABLE(); //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(pin_num[pin])); pin_int_type[pin] = type; //enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(pin_num[pin]), type); //enable global interrupt ETS_GPIO_INTR_ENABLE(); ETS_GPIO_INTR_ATTACH(func, arg) } }
bool ICACHE_FLASH_ATTR pwm_add(uint8 channel){ PWM_DBG("--Function pwm_add() is called. channel:%d\n", channel); PWM_DBG("pwm_gpio:%x,pwm_channel_num:%d\n",pwm_gpio,pwm_channel_num); PWM_DBG("pwm_out_io_num[0]:%d,[1]:%d,[2]:%d\n",pwm_out_io_num[0],pwm_out_io_num[1],pwm_out_io_num[2]); PWM_DBG("pwm.duty[0]:%d,[1]:%d,[2]:%d\n",pwm.duty[0],pwm.duty[1],pwm.duty[2]); uint8 i; for(i=0;i<PWM_CHANNEL;i++){ if(pwm_out_io_num[i]==channel) // already exist return true; if(pwm_out_io_num[i] == -1){ // empty exist pwm_out_io_num[i] = channel; pwm.duty[i] = 0; pwm_gpio |= (1 << pin_num[channel]); PIN_FUNC_SELECT(pin_mux[channel], pin_func[channel]); GPIO_REG_WRITE(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[channel])), GPIO_REG_READ(GPIO_PIN_ADDR(GPIO_ID_PIN(pin_num[channel]))) & (~ GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_ENABLE))); //disable open drain; pwm_channel_num++; return true; } } return false; }
void ICACHE_FLASH_ATTR vibrate_init(uint8 gpio_id) { uint32 v_gpio_name=tisan_get_gpio_name(gpio_id); uint8 v_gpio_func=tisan_get_gpio_general_func(gpio_id); PIN_FUNC_SELECT(v_gpio_name, v_gpio_func); PIN_PULLUP_EN(v_gpio_name); gpio_output_set(0, 0, 0, GPIO_ID_PIN(gpio_id)); //set as input mode gpio_register_set(GPIO_PIN_ADDR(gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear interrupt status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(gpio_id)); //enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(gpio_id), GPIO_PIN_INTR_NEGEDGE); peri_alarm_init(ALARM_GPIO_ID); peri_vibrate_tim_start(100); }
/** * Sets the 'gpio_pin' pin as a GPIO and sets the interrupt to trigger on that pin */ bool ICACHE_FLASH_ATTR easygpio_setupInterrupt(uint8_t gpio_pin, bool pullUp, bool pullDown, void (*interruptHandler)(void)) { uint32_t gpio_name; uint8_t gpio_func; if (gpio_pin == 6 || gpio_pin == 7 || gpio_pin == 8 || gpio_pin == 11 || gpio_pin >= 17) { os_printf("easygpio_setupInterrupt Error: There is no GPIO%d, check your code\n", gpio_pin); return false; } if (gpio_pin == 16) { os_printf("easygpio_setupInterrupt Error: GPIO16 does not have interrupts\n"); return false; } if (!easygpio_getGpioNameFunc(gpio_pin, &gpio_name, &gpio_func) ) { return false; } ETS_GPIO_INTR_ATTACH(interruptHandler, NULL); ETS_GPIO_INTR_DISABLE(); PIN_FUNC_SELECT(gpio_name, gpio_func); easygpio_setupPulls(gpio_name, pullUp, pullDown); // disable output GPIO_DIS_OUTPUT(gpio_pin); gpio_register_set(GPIO_PIN_ADDR(gpio_pin), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear gpio14 status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(gpio_pin)); ETS_GPIO_INTR_ENABLE(); return true; }
void Softuart_Init(Softuart *s, uint16_t baudrate) { //disable rs485 s->is_rs485 = 0; if(! _Softuart_Instances_Count) { os_printf("SOFTUART initialize gpio\r\n"); //Initilaize gpio subsystem gpio_init(); } //set bit time s->bit_time = (1000000 / baudrate); os_printf("SOFTUART bit_time is %d\r\n",s->bit_time); //init tx pin if(!s->pin_tx.gpio_mux_name) { os_printf("SOFTUART ERROR: Set tx pin (%d)\r\n",s->pin_tx.gpio_mux_name); } else { //enable pin as gpio PIN_FUNC_SELECT(s->pin_tx.gpio_mux_name, s->pin_tx.gpio_func); //set pullup (UART idle is VDD) PIN_PULLUP_EN(s->pin_tx.gpio_mux_name); //set high for tx idle GPIO_OUTPUT_SET(GPIO_ID_PIN(s->pin_tx.gpio_id), 1); os_delay_us(100000); os_printf("SOFTUART TX INIT DONE\r\n"); } //init rx pin if(!s->pin_rx.gpio_mux_name) { os_printf("SOFTUART ERROR: Set rx pin (%d)\r\n",s->pin_rx.gpio_mux_name); } else { //enable pin as gpio PIN_FUNC_SELECT(s->pin_rx.gpio_mux_name, s->pin_rx.gpio_func); //set pullup (UART idle is VDD) PIN_PULLUP_EN(s->pin_rx.gpio_mux_name); //set to input -> disable output GPIO_DIS_OUTPUT(GPIO_ID_PIN(s->pin_rx.gpio_id)); //set interrupt related things //disable interrupts by GPIO ETS_GPIO_INTR_DISABLE(); //attach interrupt handler and a pointer that will be passed around each time ETS_GPIO_INTR_ATTACH(Softuart_Intr_Handler, s); //not sure what this does... (quote from example): // void gpio_register_set(uint32 reg_id, uint32 value); // // From include file // Set the specified GPIO register to the specified value. // This is a very general and powerful interface that is not // expected to be used during normal operation. It is intended // mainly for debug, or for unusual requirements. // // All people repeat this mantra but I don't know what it means // gpio_register_set(GPIO_PIN_ADDR(s->pin_rx.gpio_id), GPIO_PIN_INT_TYPE_SET(GPIO_PIN_INTR_DISABLE) | GPIO_PIN_PAD_DRIVER_SET(GPIO_PAD_DRIVER_DISABLE) | GPIO_PIN_SOURCE_SET(GPIO_AS_PIN_SOURCE)); //clear interrupt handler status, basically writing a low to the output GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(s->pin_rx.gpio_id)); //enable interrupt for pin on any edge (rise and fall) //@TODO: should work with ANYEDGE (=3), but complie error gpio_pin_intr_state_set(GPIO_ID_PIN(s->pin_rx.gpio_id), 3); //globally enable GPIO interrupts ETS_GPIO_INTR_ENABLE(); os_printf("SOFTUART RX INIT DONE\r\n"); } //add instance to array of instances _Softuart_GPIO_Instances[s->pin_rx.gpio_id] = s; _Softuart_Instances_Count++; os_printf("SOFTUART INIT DONE\r\n"); }