Browse Source

change: gpio,Air8000的GPIO23,当存在wifi芯片时,禁止操作

作为后备措施, 新增pm.WIFI常量, 通过pm.power(pm.WIFI, 0) 可以控制
Wendal Chen 2 months ago
parent
commit
9a6fb53b48
3 changed files with 35 additions and 1 deletions
  1. 3 0
      luat/include/luat_pm.h
  2. 23 0
      luat/modules/luat_lib_gpio.c
  3. 9 1
      luat/modules/luat_lib_pm.c

+ 3 - 0
luat/include/luat_pm.h

@@ -48,6 +48,9 @@ enum
 	LUAT_PM_POWER_LDO_CTL_PIN,
 	LUAT_PM_POWER_WIFI_STA_DTIM,
 	LUAT_PM_POWER_WIFI_AP_DTIM,
+	LUAT_PM_POWER_WIFI,
+
+	LUAT_PM_POWER_QTY,
 };
 
 // 电平类

+ 23 - 0
luat/modules/luat_lib_gpio.c

@@ -52,6 +52,17 @@ static uint32_t default_gpio_pull = Luat_GPIO_DEFAULT;
 // 记录GPIO电平,仅OUTPUT时可用
 static uint8_t gpio_out_levels[(LUAT_GPIO_PIN_MAX + 7) / 8];
 
+static inline int check_wifi_pwr_pin(int pin) {
+    #ifdef LUAT_MODEL_AIR8000
+    extern int luat_airlink_has_wifi(void);
+    if (23 == pin && luat_airlink_has_wifi()) {
+        LLOGW("gpio23 is wifi power pin, operation denied");
+        return 1; // wifi电源管脚禁止操作
+    }
+    #endif
+    return 0;
+}
+
 static uint8_t gpio_bit_get(int pin) {
     if (pin < 0 || pin >= LUAT_GPIO_PIN_MAX)
         return 0;
@@ -247,6 +258,9 @@ static int l_gpio_setup(lua_State *L) {
         LLOGW("id out of range 0 ~ %d, but %d", LUAT_GPIO_PIN_MAX, conf.pin);
         return 0;
     }
+    if (check_wifi_pwr_pin(conf.pin)) {
+        return 0;
+    }
     //conf->mode = luaL_checkinteger(L, 2);
     conf.lua_ref = 0;
     conf.irq = 0;
@@ -456,6 +470,9 @@ static int l_gpio_set(lua_State *L) {
         pin = luaL_checkinteger(L, 1);
         value = luaL_checkinteger(L, 2);
     }
+    if (check_wifi_pwr_pin(pin)) {
+        return 0;
+    }
     #ifdef LUAT_USE_DRV_GPIO
     luat_drv_gpio_set(pin, value);
     #else
@@ -514,6 +531,9 @@ static int l_gpio_close(lua_State *L) {
     int pin = luaL_checkinteger(L, 1);
     if (pin < 0 || pin >= LUAT_GPIO_PIN_MAX)
         return 0;
+    if (check_wifi_pwr_pin(pin)) {
+        return 0;
+    }
     luat_gpio_close(pin);
     if (gpios[pin].lua_ref) {
         luaL_unref(L, LUA_REGISTRYINDEX, gpios[pin].lua_ref);
@@ -575,6 +595,9 @@ static int l_gpio_toggle(lua_State *L) {
         LLOGW("pin id out of range (0-127)");
         return 0;
     }
+    if (check_wifi_pwr_pin(pin)) {
+        return 0;
+    }
     uint8_t value = gpio_bit_get(pin);
     #ifdef LUAT_USE_DRV_GPIO
     luat_drv_gpio_set(pin, value == 0 ? Luat_GPIO_HIGH : Luat_GPIO_LOW);

+ 9 - 1
luat/modules/luat_lib_pm.c

@@ -24,6 +24,7 @@
 #include "luat_base.h"
 #include "luat_pm.h"
 #include "luat_msgbus.h"
+#include "luat_gpio.h"
 #ifdef LUAT_USE_HMETA
 #include "luat_hmeta.h"
 #endif
@@ -352,6 +353,11 @@ static int l_pm_power_ctrl(lua_State *L) {
     {
     	onoff = lua_tointeger(L, 2);
     }
+    if (id == LUAT_PM_POWER_WIFI) {
+        #ifdef LUAT_MODEL_AIR8000
+        luat_gpio_set(23, onoff ? Luat_GPIO_HIGH : Luat_GPIO_LOW);
+        #endif
+    }
     #ifdef LUAT_USE_DRV_PM
     int chip = 0;
     if (lua_isinteger(L, 3)) {
@@ -653,10 +659,12 @@ static const rotable_Reg_t reg_pm[] =
 	//@const IOVOL_CAMD number camera数字电压
     { "IOVOL_CAMD", ROREG_INT(LUAT_PM_LDO_TYPE_CAMD)},
     //@const ID_NATIVE number PM控制的ID, 主芯片, 任意芯片的默认值就是它
-    { "ID_NATIVE",      ROREG_INT(1)},
+    { "ID_NATIVE",      ROREG_INT(0)},
     //@const ID_WIFI number PM控制的ID, WIFI芯片, 仅Air8000可用
     { "ID_WIFI",        ROREG_INT(1)},
 
+    { "WIFI",          ROREG_INT(LUAT_PM_POWER_WIFI)},
+
     //@const WIFI_STA_DTIM number wifi芯片控制STA模式下的DTIM间隔,单位100ms,默认值是1
     { "WIFI_STA_DTIM",  ROREG_INT(LUAT_PM_POWER_WIFI_STA_DTIM)},
     { "WIFI_AP_DTIM",   ROREG_INT(LUAT_PM_POWER_WIFI_AP_DTIM)},