]> granicus.if.org Git - esp-idf/commitdiff
Remove mutex from GPIO driver code. Replace uint8_t/uint16_t with uint32_t
authorWangjialin <wangjialin@espressif.com>
Wed, 21 Sep 2016 01:51:37 +0000 (09:51 +0800)
committerWangjialin <wangjialin@espressif.com>
Wed, 21 Sep 2016 01:51:37 +0000 (09:51 +0800)
components/driver/gpio.c
components/driver/include/driver/gpio.h

index 8bf58a14b5723438a60f68e180fd4e1dff70dc18..2cf19071707926b882a4685e4e69784b105ce7c6 100644 (file)
@@ -16,7 +16,6 @@
 #include "esp_err.h"\r
 #include "esp_intr.h"\r
 #include "freertos/FreeRTOS.h"\r
-#include "freertos/semphr.h"\r
 #include "freertos/xtensa_api.h"\r
 #include "soc/soc.h"\r
 #include "driver/gpio.h"\r
@@ -49,7 +48,7 @@
 #define GPIO_ERROR(...)\r
 #endif \r
 \r
-const uint32_t GPIO_PIN_MUX_REG[40] = {\r
+const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT] = {\r
     GPIO_PIN_REG_0,\r
     GPIO_PIN_REG_1,\r
     GPIO_PIN_REG_2,\r
@@ -92,8 +91,7 @@ const uint32_t GPIO_PIN_MUX_REG[40] = {
     GPIO_PIN_REG_39\r
 };\r
 \r
-static SemaphoreHandle_t gpio_mutex = NULL;\r
-\r
+#define IS_VALID_GPIO(gpio_num)  ( (gpio_num < GPIO_PIN_COUNT && GPIO_PIN_MUX_REG[gpio_num] != 0))\r
 static int is_valid_gpio(int gpio_num)\r
 {\r
     if(gpio_num >= GPIO_PIN_COUNT || GPIO_PIN_MUX_REG[gpio_num] == 0) {\r
@@ -103,17 +101,7 @@ static int is_valid_gpio(int gpio_num)
     return 1;\r
 }\r
 \r
-static esp_err_t gpio_mutex_init()\r
-{\r
-    if(gpio_mutex == NULL) {\r
-        gpio_mutex = xSemaphoreCreateRecursiveMutex();\r
-        if(gpio_mutex == NULL)\r
-            return ESP_FAIL;\r
-    }\r
-    return ESP_OK;\r
-}\r
-\r
-static esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, uint8_t intr_type)\r
+esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type)\r
 {\r
     if(!is_valid_gpio(gpio_num))\r
         return ESP_ERR_INVALID_ARG;\r
@@ -121,79 +109,28 @@ static esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, uint8_t intr_type)
         GPIO_ERROR("Unknown GPIO intr:%u\n",intr_type);\r
         return ESP_ERR_INVALID_ARG;\r
     }\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        GPIO.pin[gpio_num].int_type = intr_type;\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
-}\r
-\r
-static esp_err_t gpio_intr_enable(gpio_num_t gpio_num)\r
-{\r
-    if(!is_valid_gpio(gpio_num))\r
-        return ESP_ERR_INVALID_ARG;\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        if(xPortGetCoreID() == 0) {\r
-            GPIO.pin[gpio_num].int_ena = GPIO_PRO_CPU_INTR_ENA;     //enable pro cpu intr\r
-        } else {\r
-            GPIO.pin[gpio_num].int_ena = GPIO_APP_CPU_INTR_ENA;     //enable pro cpu intr\r
-        }\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
-}\r
-\r
-static esp_err_t gpio_intr_disable(gpio_num_t gpio_num)\r
-{\r
-    if(!is_valid_gpio(gpio_num))\r
-        return ESP_ERR_INVALID_ARG;\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        GPIO.pin[gpio_num].int_ena = 0;                        //disable GPIO intr\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
+    GPIO.pin[gpio_num].int_type = intr_type;\r
+    return ESP_OK;\r
 }\r
 \r
-static esp_err_t gpio_input_enable(gpio_num_t gpio_num)\r
+esp_err_t gpio_intr_enable(gpio_num_t gpio_num)\r
 {\r
     if(!is_valid_gpio(gpio_num))\r
         return ESP_ERR_INVALID_ARG;\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio_num]);\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
+    if(xPortGetCoreID() == 0) {\r
+        GPIO.pin[gpio_num].int_ena = GPIO_PRO_CPU_INTR_ENA;     //enable pro cpu intr\r
     } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
+        GPIO.pin[gpio_num].int_ena = GPIO_APP_CPU_INTR_ENA;     //enable pro cpu intr\r
     }\r
+    return ESP_OK;\r
 }\r
 \r
-static esp_err_t gpio_input_disable(gpio_num_t gpio_num)\r
+esp_err_t gpio_intr_disable(gpio_num_t gpio_num)\r
 {\r
     if(!is_valid_gpio(gpio_num))\r
         return ESP_ERR_INVALID_ARG;\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[gpio_num]);\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
+    GPIO.pin[gpio_num].int_ena = 0;                             //disable GPIO intr\r
+    return ESP_OK;\r
 }\r
 \r
 static esp_err_t gpio_output_disable(gpio_num_t gpio_num)\r
@@ -214,10 +151,8 @@ static esp_err_t gpio_output_enable(gpio_num_t gpio_num)
         GPIO_ERROR("io_num=%d can only be input\n",gpio_num);\r
         return ESP_ERR_INVALID_ARG;\r
     }\r
-    if(gpio_num >= GPIO_PIN_COUNT || GPIO_PIN_MUX_REG[gpio_num] == 0) {\r
-        GPIO_ERROR("io_num=%d does not exist\n",gpio_num);\r
+    if(!is_valid_gpio(gpio_num))\r
         return ESP_ERR_INVALID_ARG;\r
-    }\r
     if(gpio_num < 32) {\r
         GPIO.enable_w1ts = (0x1 << gpio_num);\r
     } else {\r
@@ -228,7 +163,7 @@ static esp_err_t gpio_output_enable(gpio_num_t gpio_num)
 \r
 esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level)\r
 {\r
-    if(!is_valid_gpio(gpio_num))\r
+    if(!IS_VALID_GPIO(gpio_num))\r
         return ESP_ERR_INVALID_ARG;\r
     if(level) {\r
         if(gpio_num < 32)\r
@@ -255,127 +190,108 @@ int gpio_get_level(gpio_num_t gpio_num)
 \r
 esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull)\r
 {\r
-    if(gpio_mutex != NULL) {\r
-        if(!is_valid_gpio(gpio_num))\r
-            return ESP_ERR_INVALID_ARG;\r
-\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        esp_err_t ret = ESP_OK;\r
-        switch(pull) {\r
-            case GPIO_PULLUP_ONLY:\r
-                PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
-                PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
-                break;\r
-            case GPIO_PULLDOWN_ONLY:\r
-                PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
-                PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
-                break;\r
-            case GPIO_PULLUP_PULLDOWN:\r
-                PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
-                PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
-                break;\r
-            case GPIO_FLOATING:\r
-                PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
-                PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
-                break;\r
-            default:\r
-                GPIO_ERROR("Unknown pull up/down mode,gpio_num=%u,pull=%u\n",gpio_num,pull);\r
-                ret = ESP_ERR_INVALID_ARG;\r
-                break;\r
-        }\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ret;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
+    if(!is_valid_gpio(gpio_num))\r
+        return ESP_ERR_INVALID_ARG;\r
+    esp_err_t ret = ESP_OK;\r
+    switch(pull) {\r
+        case GPIO_PULLUP_ONLY:\r
+            PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
+            PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
+            break;\r
+        case GPIO_PULLDOWN_ONLY:\r
+            PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
+            PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
+            break;\r
+        case GPIO_PULLUP_PULLDOWN:\r
+            PIN_PULLUP_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
+            PIN_PULLDWN_EN(GPIO_PIN_MUX_REG[gpio_num]);\r
+            break;\r
+        case GPIO_FLOATING:\r
+            PIN_PULLUP_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
+            PIN_PULLDWN_DIS(GPIO_PIN_MUX_REG[gpio_num]);\r
+            break;\r
+        default:\r
+            GPIO_ERROR("Unknown pull up/down mode,gpio_num=%u,pull=%u\n",gpio_num,pull);\r
+            ret = ESP_ERR_INVALID_ARG;\r
+            break;\r
     }\r
+    return ret;\r
 }\r
 \r
-esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_direction_t direction)\r
+esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode)\r
 {\r
-    if(gpio_mutex != NULL) {\r
-        if(!is_valid_gpio(gpio_num))\r
-            return ESP_ERR_INVALID_ARG;\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        esp_err_t ret = ESP_OK;\r
-        switch(direction) {\r
-            case GPIO_DIR_OUTPUT_ONLY:\r
-                gpio_input_disable(gpio_num);\r
-                gpio_output_enable(gpio_num);\r
-                break;\r
-            case GPIO_DIR_INPUT_ONLY:\r
-                gpio_input_enable(gpio_num);\r
-                gpio_output_disable(gpio_num);\r
-                break;\r
-            case GPIO_DIR_INPUT_AND_OUTPUT:\r
-                gpio_input_enable(gpio_num);\r
-                gpio_output_enable(gpio_num);\r
-                break;\r
-            case GPIO_DIR_DISABLE_IO:\r
-                gpio_input_disable(gpio_num);\r
-                gpio_output_disable(gpio_num);\r
-                break;\r
-            default:\r
-                GPIO_ERROR("Unknown direction type,gpio_num=%u,direction=%u\n",gpio_num,direction);\r
-                ret = ESP_ERR_INVALID_ARG;\r
-                break;\r
+    if(!is_valid_gpio(gpio_num))\r
+        return ESP_ERR_INVALID_ARG;\r
+    if(gpio_num >= 34 && (mode & (GPIO_MODE_DEF_OUTPUT))) {\r
+        GPIO_ERROR("io_num=%d can only be input\n",gpio_num);\r
+        return ESP_ERR_INVALID_ARG;\r
+    }\r
+    esp_err_t ret = ESP_OK;\r
+    if(mode & GPIO_MODE_DEF_INPUT) {\r
+        PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[gpio_num]);\r
+    } else {\r
+        PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[gpio_num]);\r
+    }\r
+    if(mode & GPIO_MODE_DEF_OUTPUT) {\r
+        if(gpio_num < 32) {\r
+            GPIO.enable_w1ts = (0x1 << gpio_num);\r
+        } else {\r
+            GPIO.enable1_w1ts.data = (0x1 << (gpio_num - 32));\r
         }\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ret;\r
     } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
+        if(gpio_num < 32) {\r
+            GPIO.enable_w1tc = (0x1 << gpio_num);\r
+        } else {\r
+            GPIO.enable1_w1tc.data = (0x1 << (gpio_num - 32));\r
+        }\r
+    }\r
+    if(mode & GPIO_MODE_DEF_OD) {\r
+        GPIO.pin[gpio_num].pad_driver = 1;\r
+    } else {\r
+        GPIO.pin[gpio_num].pad_driver = 0;\r
     }\r
+    return ret;\r
 }\r
 \r
 esp_err_t gpio_config(gpio_config_t *pGPIOConfig)\r
 {\r
-    if(gpio_mutex == NULL) {\r
-        gpio_mutex = xSemaphoreCreateRecursiveMutex();\r
-        if(gpio_mutex == NULL) {\r
-            GPIO_ERROR("Mutex null\n");\r
-            return ESP_FAIL;\r
-        }\r
-    }\r
     uint64_t gpio_pin_mask = (pGPIOConfig->pin_bit_mask);\r
     uint32_t io_reg = 0;\r
-    uint8_t io_num = 0;\r
+    uint32_t io_num = 0;\r
     uint64_t bit_valid = 0;\r
-    if(pGPIOConfig->pin_bit_mask == 0) {\r
-        GPIO_ERROR("GPIO_PIN = 0 \n");\r
+    if(pGPIOConfig->pin_bit_mask == 0 || pGPIOConfig->pin_bit_mask >= (((uint64_t) 1) << GPIO_PIN_COUNT)) {\r
+        GPIO_ERROR("GPIO_PIN mask error \n");\r
         return ESP_ERR_INVALID_ARG;\r
     }\r
-    if((pGPIOConfig->mode) & (BIT1)) {\r
+    if((pGPIOConfig->mode) & (GPIO_MODE_DEF_OUTPUT)) {\r
         //GPIO 34/35/36/37/38/39 can only be used as input mode;\r
         if((gpio_pin_mask & ( GPIO_SEL_34 | GPIO_SEL_35 | GPIO_SEL_36 | GPIO_SEL_37 | GPIO_SEL_38 | GPIO_SEL_39))) {\r
             GPIO_ERROR("GPIO34-39 can only be used as input mode\n");\r
             return ESP_ERR_INVALID_ARG;\r
         }\r
     }\r
-    xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
     do {\r
         io_reg = GPIO_PIN_MUX_REG[io_num];\r
         if(((gpio_pin_mask >> io_num) & BIT(0)) && io_reg) {\r
             GPIO_INFO("Gpio%02d |Mode:",io_num);\r
-            if((pGPIOConfig->mode) & GPIO_MODE_INPUT) {\r
+            if((pGPIOConfig->mode) & GPIO_MODE_DEF_INPUT) {\r
                 GPIO_INFO("INPUT ");\r
-                gpio_input_enable(io_num);\r
+                PIN_INPUT_ENABLE(GPIO_PIN_MUX_REG[io_num]);\r
             } else {\r
-                gpio_input_disable(io_num);\r
+                PIN_INPUT_DISABLE(GPIO_PIN_MUX_REG[io_num]);\r
             }\r
-            if((pGPIOConfig->mode) & BIT2) {\r
+            if((pGPIOConfig->mode) & GPIO_MODE_DEF_OD) {\r
                 GPIO_INFO("OD ");\r
                 GPIO.pin[io_num].pad_driver = 1; /*0x01 Open-drain */\r
             } else {\r
                 GPIO.pin[io_num].pad_driver = 0; /*0x00 Normal gpio output */\r
             }\r
-            if((pGPIOConfig->mode) & GPIO_MODE_OUTPUT) {\r
+            if((pGPIOConfig->mode) & GPIO_MODE_DEF_OUTPUT) {\r
                 GPIO_INFO("OUTPUT ");\r
                 gpio_output_enable(io_num);\r
             } else {\r
                 gpio_output_disable(io_num);\r
-            }\r
-            GPIO_INFO("|");\r
+            }GPIO_INFO("|");\r
             if(pGPIOConfig->pull_up_en) {\r
                 GPIO_INFO("PU ");\r
                 PIN_PULLUP_EN(io_reg);\r
@@ -401,57 +317,40 @@ esp_err_t gpio_config(gpio_config_t *pGPIOConfig)
         }\r
         io_num++;\r
     } while(io_num < GPIO_PIN_COUNT);\r
-    xSemaphoreGiveRecursive(gpio_mutex);\r
     return ESP_OK;\r
 }\r
 \r
-esp_err_t gpio_intr_handler_register(uint8_t gpio_intr_num, void (*fn)(void*), void * arg)\r
+esp_err_t gpio_intr_handler_register(uint32_t gpio_intr_num, void (*fn)(void*), void * arg)\r
 {\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        ESP_INTR_DISABLE(gpio_intr_num);\r
-        intr_matrix_set(xPortGetCoreID(), ETS_GPIO_INTR_SOURCE, gpio_intr_num);\r
-        xt_set_interrupt_handler(gpio_intr_num, fn, arg);\r
-        ESP_INTR_ENABLE(gpio_intr_num);\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
+    if(fn == NULL)\r
+        return ESP_ERR_INVALID_ARG;\r
+    ESP_INTR_DISABLE(gpio_intr_num);\r
+    intr_matrix_set(xPortGetCoreID(), ETS_GPIO_INTR_SOURCE, gpio_intr_num);\r
+    xt_set_interrupt_handler(gpio_intr_num, fn, arg);\r
+    ESP_INTR_ENABLE(gpio_intr_num);\r
+    return ESP_OK;\r
 }\r
 \r
 /*only level interrupt can be used for wake-up function*/\r
 esp_err_t gpio_pin_wakeup_enable(gpio_num_t gpio_num, gpio_int_type_t intr_type)\r
 {\r
-    if(gpio_mutex != NULL) {\r
-        esp_err_t ret = ESP_OK;\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        if((intr_type == GPIO_PIN_INTR_LOW_LEVEL) || (intr_type == GPIO_PIN_INTR_HIGH_LEVEL)) {\r
-            GPIO.pin[gpio_num].int_type = intr_type;\r
-            GPIO.pin[gpio_num].wakeup_enable = 0x1;\r
-        } else {\r
-            GPIO_ERROR("GPIO wakeup only support Level mode,but edge mode set. gpio_num:%u\n",gpio_num);\r
-            ret = ESP_ERR_INVALID_ARG;\r
-        }\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ret;\r
+    if(!is_valid_gpio(gpio_num))\r
+        return ESP_ERR_INVALID_ARG;\r
+    esp_err_t ret = ESP_OK;\r
+    if((intr_type == GPIO_PIN_INTR_LOW_LEVEL) || (intr_type == GPIO_PIN_INTR_HIGH_LEVEL)) {\r
+        GPIO.pin[gpio_num].int_type = intr_type;\r
+        GPIO.pin[gpio_num].wakeup_enable = 0x1;\r
     } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
+        GPIO_ERROR("GPIO wakeup only support Level mode,but edge mode set. gpio_num:%u\n",gpio_num);\r
+        ret = ESP_ERR_INVALID_ARG;\r
     }\r
+    return ret;\r
 }\r
 \r
 esp_err_t gpio_pin_wakeup_disable(gpio_num_t gpio_num)\r
 {\r
-    if(gpio_mutex != NULL) {\r
-        xSemaphoreTakeRecursive(gpio_mutex, portMAX_DELAY);\r
-        GPIO.pin[gpio_num].wakeup_enable = 0;\r
-        xSemaphoreGiveRecursive(gpio_mutex);\r
-        return ESP_OK;\r
-    } else {\r
-        GPIO_ERROR("Mutex null\n");\r
-        return ESP_FAIL;\r
-    }\r
-\r
+    if(!is_valid_gpio(gpio_num))\r
+        return ESP_ERR_INVALID_ARG;\r
+    GPIO.pin[gpio_num].wakeup_enable = 0;\r
+    return ESP_OK;\r
 }\r
index 9bc62adc8d3477300d639392b574c3dd7a22f6a1..de04a4209d117bb8d172a2ec4fba9e53d484bf97 100644 (file)
@@ -26,8 +26,6 @@
 extern "C" {
 #endif
 
-extern const uint32_t GPIO_PIN_MUX_REG[40];
-
 #define GPIO_SEL_0              (BIT(0))                         /* Pin 0 selected */
 #define GPIO_SEL_1              (BIT(1))                         /* Pin 1 selected */
 #define GPIO_SEL_2              (BIT(2))                         /* Pin 2 selected */
@@ -115,6 +113,12 @@ extern const uint32_t GPIO_PIN_MUX_REG[40];
 #define GPIO_ID_PIN(n)              (GPIO_ID_PIN0 + (n))
 #define GPIO_PIN_ADDR(i)            (GPIO_PIN0_REG + i * 4)
 
+#define GPIO_MODE_DEF_INPUT           (BIT0)
+#define GPIO_MODE_DEF_OUTPUT          (BIT1)
+#define GPIO_MODE_DEF_OD              (BIT2)
+
+extern const uint32_t GPIO_PIN_MUX_REG[GPIO_PIN_COUNT];
+
 typedef enum {
     GPIO_NUM_0 = 0,
     GPIO_NUM_1 = 1,
@@ -166,11 +170,11 @@ typedef enum {
 } gpio_int_type_t;
 
 typedef enum {
-    GPIO_MODE_INPUT = (BIT0),                           /* GPIO mode : input only                           */
-    GPIO_MODE_OUTPUT = (BIT1),                          /* GPIO mode : output only mode                     */
-    GPIO_MODE_OUTPUT_OD = ((BIT1)|(BIT2)),              /* GPIO mode : output only with open-drain mode     */
-    GPIO_MODE_INPUT_OUTPUT_OD = ((BIT0)|(BIT1)|(BIT2)), /* GPIO mode : output and input with open-drain mode*/
-    GPIO_MODE_INPUT_OUTPUT = ((BIT0)|(BIT1)),           /* GPIO mode : output and input mode                */
+    GPIO_MODE_INPUT = GPIO_MODE_DEF_INPUT,                                                         /* GPIO mode : input only                           */
+    GPIO_MODE_OUTPUT = GPIO_MODE_DEF_OUTPUT,                                                       /* GPIO mode : output only mode                     */
+    GPIO_MODE_OUTPUT_OD = ((GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)),                             /* GPIO mode : output only with open-drain mode     */
+    GPIO_MODE_INPUT_OUTPUT_OD = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)|(GPIO_MODE_DEF_OD)), /* GPIO mode : output and input with open-drain mode*/
+    GPIO_MODE_INPUT_OUTPUT = ((GPIO_MODE_DEF_INPUT)|(GPIO_MODE_DEF_OUTPUT)),                       /* GPIO mode : output and input mode                */
 } gpio_mode_t;
 
 typedef enum {
@@ -191,13 +195,6 @@ typedef struct {
     gpio_int_type_t intr_type;      /* GPIO interrupt type                                  */
 } gpio_config_t;
 
-typedef enum {
-    GPIO_DIR_OUTPUT_ONLY,          /* GPIO output         */
-    GPIO_DIR_INPUT_ONLY,           /* GPIO input          */
-    GPIO_DIR_INPUT_AND_OUTPUT,     /* GPIO input + output */
-    GPIO_DIR_DISABLE_IO,           /* GPIO disable        */
-} gpio_direction_t;
-
 typedef enum {
     GPIO_LOW_LEVEL = 0,
     GPIO_HIGH_LEVEL = 1,
@@ -242,21 +239,59 @@ typedef void (*gpio_event_callback)(gpio_num_t gpio_intr_num);
  *                 pGPIOConfig.pull_down_en   : Enable or Disable pull-down
  *                 pGPIOConfig.intr_type : Configure GPIO interrupt trigger type
  * @return            ESP_OK: success ;
- *                 ESP_ERR_INVALID_ARG: parameters error
- *                 ESP_FAIL : GPIO mutex error
+ *                 ESP_ERR_INVALID_ARG: parameter error
+ *                 ESP_FAIL : GPIO error
  *
  */
 esp_err_t gpio_config(gpio_config_t *pGPIOConfig);
 
+
+/**
+ * @brief      GPIO set interrupt trigger type
+ *
+ * @parameter[in]  gpio_num : GPIO number.
+ *                            If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16);
+ * @parameter[in]  intr_type: interrupt type, select from gpio_int_type_t
+ *
+ * @return         ESP_OK   : success
+ *                 ESP_ERR_INVALID_ARG: parameter error
+ *
+ */
+esp_err_t gpio_set_intr_type(gpio_num_t gpio_num, gpio_int_type_t intr_type);
+
+/**
+ * @brief      enable GPIO module interrupt signal
+ *
+ * @parameter[in]  gpio_num : GPIO number.
+ *                            If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16);
+ *
+ * @return         ESP_OK   : success
+ *                 ESP_ERR_INVALID_ARG: parameter error
+ *
+ */
+esp_err_t gpio_intr_enable(gpio_num_t gpio_num);
+
+/**
+ * @brief      disable GPIO module interrupt signal
+ *
+ * @parameter[in]  gpio_num : GPIO number.
+ *                            If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16);
+ *
+ * @return         ESP_OK   : success
+ *                 ESP_ERR_INVALID_ARG: parameter error
+ *
+ */
+esp_err_t gpio_intr_disable(gpio_num_t gpio_num);
+
 /**
  * @brief         GPIO set output level
  *
  * @parameter[in]  gpio_num : GPIO number.
- *                            If you want to set output level of GPIO16, gpio_num should be  GPIO_NUM_16 (16);
+ *                            If you want to set output level of GPIO16, gpio_num should be GPIO_NUM_16 (16);
  * @parameter[in]  level    : Output level. 0: low ; 1: high
  *
  * @return            ESP_OK   : success
- *                 ESP_FAIL : GPIO mutex error
+ *                 ESP_FAIL : GPIO error
  *
  */
 esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level);
@@ -265,7 +300,7 @@ esp_err_t gpio_set_level(gpio_num_t gpio_num, uint32_t level);
  * @brief         GPIO get input level
  *
  * @parameter[in]  gpio_num : GPIO number.
- *                            If you want to get level of pin GPIO16, gpio_num should be  GPIO_NUM_16 (16);
+ *                            If you want to get level of pin GPIO16, gpio_num should be GPIO_NUM_16 (16);
  *
  * @return         0  : the GPIO input level is 0
  *              1  : the GPIO input level is 1
@@ -278,29 +313,29 @@ int gpio_get_level(gpio_num_t gpio_num);
  *
  * Configure GPIO direction,such as output_only,input_only,output_and_input
  *
- * @parameter[in]  gpio_num : Configure GPIO pins number,it should  GPIO number.
- *                            If you want to set direction of GPIO16, gpio_num should be  GPIO_NUM_16 (16);
- * @parameter[in]  direction: Configure GPIO direction,such as output_only,input_only,...
+ * @parameter[in]  gpio_num : Configure GPIO pins number,it should be GPIO number.
+ *                            If you want to set direction of GPIO16, gpio_num should be GPIO_NUM_16 (16);
+ * @parameter[in]  mode     : Configure GPIO direction,such as output_only,input_only,...
  *
  * @return            ESP_OK   : success
  *                 ESP_ERR_INVALID_ARG : fail
- *                 ESP_FAIL : GPIO mutex error
+ *                 ESP_FAIL : GPIO error
  *
  */
-esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_direction_t direction);
+esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
 
 /**
  * @brief         GPIO set pull
  *
  * User this Function,configure GPIO pull mode,such as pull-up,pull-down
  *
- * @parameter[in]  gpio_num : Configure GPIO pins number,it should  GPIO number.
+ * @parameter[in]  gpio_num : Configure GPIO pins number,it should be GPIO number.
  *                            If you want to set pull up or down mode for GPIO16,gpio_num should be GPIO_NUM_16 (16);
  * @parameter[in]  pull     : Configure GPIO pull up/down mode,such as pullup_only,pulldown_only,pullup_and_pulldown,...
  *
  * @return            ESP_OK   : success
  *                 ESP_ERR_INVALID_ARG : fail
- *                 ESP_FAIL : GPIO mutex error
+ *                 ESP_FAIL : GPIO error
  *
  */
 esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull);
@@ -313,7 +348,7 @@ esp_err_t gpio_set_pull_mode(gpio_num_t gpio_num, gpio_pull_mode_t pull);
  * Second , enable the GPIO input,if you use pin_func_as_gpio,you can use gpio_set_direction function
  * Third ,  call gpio_matrix_in function
  *
- * @parameter[in]  GPIO       : Configure GPIO pins number,it should  GPIO number.
+ * @parameter[in]  GPIO       : Configure GPIO pins number,it should be GPIO number.
  *                              If you want to configure GPIO16, gpio_num should be GPIO_NUM_16 (16);
  * @parameter[in]  signal_idx : the signal_idx,find the signal index from gpio_sig_map.h
  *
@@ -351,19 +386,30 @@ void gpio_matrix_out(uint32_t GPIO, uint32_t signal_idx, bool out_inv, bool oen_
  *          Users should know that which CPU is running and then pick a INUM that is not used by system.
  *          We can find the information of INUM and interrupt level in soc.h.
  *          TODO: to move INUM options to menu_config
- * @parameter   uint8_t gpio_intr_num     : GPIO interrupt number,check the info in soc.h, and please see the core-isa.h for more details
+ * @parameter   uint32_t gpio_intr_num     : GPIO interrupt number,check the info in soc.h, and please see the core-isa.h for more details
  * @parameter   void (* fn)(void* )       : interrupt handler function.
  *                                          Note that the handler function MUST be defined with attribution of "IRAM_ATTR".
  * @parameter   void * arg                : parameter for handler function
  *
  * @return      ESP_OK : success ;
- *              ESP_FAIL: gpio_mutex error
+ *              ESP_FAIL: gpio_ error
  */
-esp_err_t gpio_intr_handler_register(uint8_t gpio_intr_num, void (*fn)(void*), void * arg);
+esp_err_t gpio_intr_handler_register(uint32_t gpio_intr_num, void (*fn)(void*), void * arg);
 
 
 
 
+/**
+ * ***************        ATTENTION       ********************/
+/**
+ *
+ * Each GPIO have their separated registers, so we don't have to use
+ * lock for multi-task issues.
+ * Please make sure that there would be no such situation, in which,
+ * different tasks read-then-write the same GPIO register.
+ */
+
+
 /*----------EXAMPLE TO CONIFGURE GPIO AS OUTPUT ------------ */
 /*     gpio_config_t io_conf;
  *     io_conf.intr_type = GPIO_PIN_INTR_DISABLE;             //disable interrupt
@@ -425,8 +471,6 @@ esp_err_t gpio_intr_handler_register(uint8_t gpio_intr_num, void (*fn)(void*), v
  *
  */
 
-
-
 /**
  * @}
  */