gpio: fix gpio AT test

Change-Id: I0a6377cad378e24dbda37e969d9f64262f467a6d
diff --git a/mbtk/mbtk_lib/src/mbtk_gpio.c b/mbtk/mbtk_lib/src/mbtk_gpio.c
index c761476..a0f54c7 100755
--- a/mbtk/mbtk_lib/src/mbtk_gpio.c
+++ b/mbtk/mbtk_lib/src/mbtk_gpio.c
@@ -7,7 +7,6 @@
  *   \Version: 1.0.0
  *   \Date: 2022-04-26
  */
-
 #include <stdio.h>
 #include <string.h>
 #include <sys/types.h>
@@ -25,6 +24,14 @@
 #include "gpio-define.h"
 
 #define gpio_log(...)     if(gpio_debug)printf(__VA_ARGS__)
+#define HWMAP_DEVICE "/dev/hwmap"
+#define PAGE_OFFS_BITS(pgsz) ((unsigned int)(pgsz)-1)
+#define PAGE_MASK_BITS(pgsz) (~PAGE_OFFS_BITS(pgsz))
+
+typedef enum {
+    MBTK_ADC0 = 0,  /* ADC 0 */
+    MBTK_ADC1       /* ADC 1 */
+} mbtk_adc_enum;
 
 static int gpio_debug = 0;
 
@@ -128,70 +135,26 @@
     {GPIO_FUNC_VCXO_OUT, 1},        //GPIO_126
     {0,0},
 };
-#if 0
-/**
- *  \brief strstr_n
- *
- *  find string return number
- *
- *  \param param
- *  \return return type
- */
-int strstr_n(const char *s1, const char *s2)
-{
-    int n;
-    int strlen = 0;
 
-    if(*s2)
-    {
-        while(*s1)
-        {
-            for(n = 0; *(s1+n) == *(s2 + n); n++)
-            {
-                if(!*(s2 + n + 1))
-                {
-                    strlen++;
-                    return strlen;
-                }
-            }
-            s1++;
-            strlen++;
-        }
-        return 0;
-    }else
-        return 0;
-}
-static short int from_hex(char a)
-{
-    if (a >= 'A' && a <= 'F')
-        return a - 'A' + 10;
-    else if (a >= 'a' && a <= 'f')
-        return a - 'a' + 10;
-    else
-        return a - '0';
-}
 
-int str_to_hex(char *str)
+static int mbtk_gpio_adc()
 {
-    unsigned char str_len = strlen(str);
-    int i;
     int ret = 0;
 
-    if(str[0] != '0' || (str[1] != 'x' && str[1] != 'X'))
-    {
-        printf("%s error, %s!\n", __FUNCTION__, str);
-        return ret;
+    ret =  mbtk_adc_get(0);
+    printf("ADC_value =%d\n", ret);
+    if(ret >= 500 ){
+        ret = 1;
     }
-    for (i = 2; i < str_len; ++i) {
-        ret = ret * 16 + from_hex(str[i]);
+    else if (ret>=0 && ret<=480){
+        ret = 0;
+    }
+    else{
+        ret = -1;
     }
     return ret;
 }
-#endif
 
-#define HWMAP_DEVICE "/dev/hwmap"
-#define PAGE_OFFS_BITS(pgsz) ((unsigned int)(pgsz)-1)
-#define PAGE_MASK_BITS(pgsz) (~PAGE_OFFS_BITS(pgsz))
 
 static int hwacc_register(int rw, unsigned int addr, unsigned int *data)
 {
@@ -314,7 +277,9 @@
     pclose(fp);
 
 #else
+    usleep(50);
     hwacc_register(1, reg, &value);
+    usleep(50);
 #endif
 }
 /*
@@ -343,7 +308,7 @@
     ret = gpio_register_read(reg->reg);
     if((ret & 0x7) != reg->func_gpio)
     {
-        gpio_log("Gpio set func [%d] [0x%x]!\n", reg->func_gpio, (ret & 0xfffffff8) | reg->func_gpio);
+        //printf("Gpio set func [%d] [0x%x]!\n", reg->func_gpio, (ret & 0xfffffff8) | reg->func_gpio);
         gpio_register_write(reg->reg, (ret & 0xfffffff8) | reg->func_gpio);
     }
     return 0;
@@ -370,15 +335,18 @@
     reg += 0x0c;
     port = port % 0x20;
     ret = gpio_register_read(reg);
+    //printf("[Direction] reg_value=%x\n", ret);
     // 设置 输出 0 && 1
     if(!(ret & (0x1 << port)) && dir)
     {
         gpio_register_write(reg, ret | (0x1 << port));
+        //printf("[Direction out] reg_value=%x\n",  gpio_register_read(reg));
     }
     // 设置 输入 1 && 0
     if((ret & (0x1 << port)) && !dir)
     {
         gpio_register_write(reg, ret | !(0x1 << port));
+        //printf("[Direction in] reg_value=%x\n",  gpio_register_read(reg));
     }
 }
 /*
@@ -423,16 +391,19 @@
 
     port = port % 0x20;
     ret = gpio_register_read(reg);
+    //printf("[Value] reg_value=%x\n", gpio_register_read(0xD4019004));
     // 设置 高电平 0 && 1
     if(value)
     {
         gpio_register_write(reg, ret | (0x1 << port));
+        //printf("[Value high] reg_value=%x\n", gpio_register_read(0xD4019004));
         return;
     }
     // 设置 低电平 1 && 0
     if(!(ret & (0x1 << port)) && !value)
     {
         gpio_register_write(reg, ret | (0x1 << port));
+        //printf("[Value low] reg_value=%x\n", gpio_register_read(0xD4019004));
     }
 }
 /*
@@ -471,61 +442,124 @@
 int gpio_register_test_out(int port, int value)
 {
     int ret;
-    gpio_log("Gpio port [%d] test start!\n", port);
-    ret = gpio_register_set_func_0(port);
-    if(ret)
-    {
+    int i;
+    int valueh = 0;
+    int valuel = 1;
+    
+    printf("Gpio port [%d] test start!\n", port);
+    ret = gpio_register_set_func_0(port);           //设功能为GPIO
+    if(ret){
         printf("gpio_port can't support!\n");
         return -1;
     }
-
-    gpio_register_set_direction(port, 1);
+    gpio_register_set_direction(port, 1);           //设方向为输出
     ret = gpio_register_get_value(port);
-    gpio_log("gpio default value is : %d.\n", ret);
-
-    gpio_register_set_value(port, 1);
-    ret = gpio_register_get_value(port);
-    gpio_log("######gpio should is high: %d.######\n", ret);
-    if(1 != ret)
+    printf("gpio default value is : %d.\n", ret);
+    
+    
+    //[High]
+    for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 1);
+        usleep(50);
+        valueh = gpio_register_get_value(port);
+        printf("set high? %d\n",valueh);
+        if(1 == valueh){
+            break;
+        }
+    }
+    usleep(200000);
+    for(i = 0; i <= 20; i++){
+        ret = mbtk_gpio_adc();  
+        usleep(100000);
+        if(1 == ret){
+            break;
+        }
+    }
+    printf("------gpio should is high: %d.------\n", ret);
+    if(1 != ret){
+        ret=-1;
         goto exit;
-    usleep(50);
+    }
 
-    gpio_register_set_value(port, 0);
-    ret = gpio_register_get_value(port);
-    gpio_log("######gpio should is low: %d.######\n", ret);
-    if(0 != ret)
-    {
+
+    //[Low]
+     usleep(200);
+     for(i = 0; i <= 10; i++){
+        gpio_register_set_value(port, 0);               //输出低
+        usleep(50);
+        valuel = gpio_register_get_value(port);
+        printf("set low? %d\n",valuel);
+        if(0 == valuel){
+            break;
+        }
+    }
+    usleep(200000);
+    for(i = 0; i <= 20; i++){
+        ret = mbtk_gpio_adc();  
+        usleep(100000);
+        if(0 == ret){
+            break;
+        }
+    }
+    printf("******gpio should is low: %d.******\n", ret);
+    if(0 != ret){
+        ret=-1;
         goto exit;
     }
 
 exit:
-    gpio_register_set_direction(port, 0);
-
+    //gpio_register_set_direction(port, 0);  //设方向为输入
     return ret;
 }
 
 int mbtk_at_gpio(void* arg)
 {
-    int test_gpio[] = {33, 35, 36, 34, 82, 83, 81, /*41, 40, 39, 38, 37, 42,*/
-                       21, 4, 122, 123, 20, 43, 13, 12, 14, 118, 19, 120,
-                       49, 50, 32, 31, /*51, 52, */53, 54, 119, 23, 24, 27, 28, 26, 25, 5, 9,
-                       0, 1, 2, 3, 6, 7, 15, 18, 16, 17,
-                       126, 125, 56, 55, 58, 48, 57, 59, 117, 29, 30};
+    /* 
+      error:53
+    */
+    int test_gpio[] = 
+    { 
+     56, 55, 58, 57, 48,  59, 12, 20,  5,  43,  21,
+     49, 50, 27, 28, 26,  25, 16, 17, 15, 126, 125,
+      4,  0,  3, 18,  7,   6,  1,  2, 54,  19,  13, 
+     32, 31, 23, 24, 22, 122, 33, 35, 36,  34,  14,
+     99,/*53,*/37,38,39,40,41,42};
 
-    int i, ret, total, n = 0;
+    int i, j, ret, total, n = 0;
     int *fail_io = (int *)arg;
     total = (sizeof(test_gpio)/sizeof(int));
-    printf("Start test gpio total: %d\n", total);
-    for(i = 0; i < total; i++)
-    {
+    //printf("Start test gpio total: %d\n", total);
+    
+    /* [1 all gpio set to low] */
+    for(j = 0; j < 6 ; j++){
+        for(i = 0; i < total; i++){
+            gpio_register_set_func_0(test_gpio[i]);
+            gpio_register_set_direction(test_gpio[i], 1);
+            gpio_register_set_value(test_gpio[i], 0);
+        }
+      usleep(200000);
+      for(i = 0; i <= 20; i++){
+          ret = mbtk_gpio_adc();  
+          usleep(100000);
+          if(0 == ret){
+              break;
+          }
+      }
+      printf("pre set ADC: %d, times: %d\n",ret, j);
+      if(0 == ret){
+          break;
+      }
+    }
+
+    /* [2 GPIOTEST] */
+    for(i = 0; i < total; i++){
         ret = gpio_register_test_out(test_gpio[i], 0);
-        if(-1 == ret)
-        {
-            LOGI("######gpio [%d] test failed!!!!!!######\n", test_gpio[i]);
+        if(-1 == ret){
+            printf("!!!!!!!!!!!!gpio [%d] test failed!!!!!!!!!!!!\n", test_gpio[i]);
             fail_io[n] = test_gpio[i];
             n++;
         }else{
-            LOGI("######gpio [%d] test success!!!!!!######\n", test_gpio[i]);
+            printf("############gpio [%d] test success############\n", test_gpio[i]);
         }
     }
     return n;