[Feature]Adapter at+lynqfactory=gpio for L805A

Only Configure: Yes
Affected branch: DSDS
Affected module: fatory
Is it affected on both ZXIC and MTK: only MTK
Self-test: yes
Doc Update: No

Change-Id: I41885f78bbc8eacd97bf7b341290fced8dcf9ea1
diff --git a/IC_meta/mtk/2735/liblynq-at-factory/liblynq-at-factory.bb b/IC_meta/mtk/2735/liblynq-at-factory/liblynq-at-factory.bb
index 7e1077d..24c245b 100755
--- a/IC_meta/mtk/2735/liblynq-at-factory/liblynq-at-factory.bb
+++ b/IC_meta/mtk/2735/liblynq-at-factory/liblynq-at-factory.bb
@@ -45,5 +45,7 @@
     if [ -d "${WORKONSRC}" ] ; then

         install -d ${D}${includedir}

         cp -af ${S}/include/libat/ ${D}${includedir}/libat

+        install -d ${D}/data/factory

+        install -m 644 ${WORKONSRC}/gpio_L805.conf ${D}/data/factory/

     fi

 }
\ No newline at end of file
diff --git a/common_src/lib/liblynq-at-factory/gpio_L805.conf b/common_src/lib/liblynq-at-factory/gpio_L805.conf
new file mode 100755
index 0000000..eaff002
--- /dev/null
+++ b/common_src/lib/liblynq-at-factory/gpio_L805.conf
@@ -0,0 +1,3 @@
+platform:L805

+total:112

+gpio:1,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,41,63,65,67,68,69,79,80,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,130,138,139,140,141,144,157,158,164,165,169,170,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,230,231,232,233,234,
\ No newline at end of file
diff --git a/common_src/lib/liblynq-at-factory/lynq_at_factory.cpp b/common_src/lib/liblynq-at-factory/lynq_at_factory.cpp
index f894d3e..6d74bf5 100755
--- a/common_src/lib/liblynq-at-factory/lynq_at_factory.cpp
+++ b/common_src/lib/liblynq-at-factory/lynq_at_factory.cpp
@@ -215,55 +215,196 @@
     pclose(fp);

 }

 

-static int set_all_gpio_status_and_check(int lynq_gpio_arr[], char status)

+static int gpio_set_commond(int gpio, const char *commond, int value)

 {

-    int m =0;

-    FILE *fp;

-    char lynq_set_gpio_arr[256] = {0};

-    char lynq_get_gpio_state[512] = {0};

-    for(m = 0; m < 85; m++)

-    {

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m]);

-        system(lynq_set_gpio_arr);

-        bzero(lynq_set_gpio_arr, 256);

-        sprintf(lynq_set_gpio_arr,"echo out %d %c > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[m], status);

-        system(lynq_set_gpio_arr);

-    }

+    char lynq_set_gpio_commond[128] = {0};

+    sprintf(lynq_set_gpio_commond,"echo %s %d %d > /sys/devices/platform/10005000.pinctrl/mt_gpio", commond, gpio, value);

+    system(lynq_set_gpio_commond);

+    return 0;

+}

+int gpio_init(int gpio, int mode, int value)

+{

+    gpio_set_commond(gpio, "mode", mode);

+    gpio_set_commond(gpio, "out", value);

+    RLOGE("gpio:%d,mode:%d,value:%d\n",gpio,mode,value);

+    return 0;

+}

 

-    bzero(lynq_set_gpio_arr, 256);

-    sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

-    fp=popen(lynq_set_gpio_arr, "r");

-    bzero(lynq_get_gpio_state, 512);

+static int gpio_status_get()

+{

+    FILE *fp;

+    char lynq_get_gpio_commond[128] = {0};

+    char lynq_get_gpio_state[64] = {0};

+    sprintf(lynq_get_gpio_commond,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

+    fp=popen(lynq_get_gpio_commond, "r");

+    if(!fp){

+        RLOGE("get gpio state error\n");

+        return -1;

+    }

     fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

     pclose(fp);

-    

-    if(lynq_get_gpio_state[7] != status)

+    int state = lynq_get_gpio_state[7] - '0';

+    return state;

+}

+

+int lynq_gpio_analysis(char *input,int *lynq_gpio_arr,int lynq_gpio_total_arr[],int total_length)

+{

+    int j = 0;

+    int k = 0;

+    int size = 0;

+    char res[64] = {0};

+    int greep = input[0] - '0';

+    sprintf(res,"the greep:%d\n",greep);//The first digit represents grouping

+    handle_output(res, strlen(res), Response);

+

+    for (int i = 1; i < strlen(input); i++)

     {

+        int num = 0;

+        for (; input[i] != ',' && input[i] != '\0'; i++)

+        {

+            if (input[i] >= '0' && input[i] <= '9')

+            {

+                num = num * 10 + (input[i] - '0');

+            }

+            else

+            {

+                handle_output("+GPIO:input error\r\n", strlen("input error\r\n"), Response);

+                return -1;

+            }

+        }

+        for (k = 0; k < total_length && num != 0;k++)

+        {

+            if(num == lynq_gpio_total_arr[k])

+            {

+                lynq_gpio_arr[size] = num;

+                size++;

+                break;

+            }

+        }

+        if(k >= total_length)

+        {

+            bzero(res,64);

+            sprintf(res,"+GPIO:GPIO%d input error\r\n",num);

+            handle_output(res, strlen(res), Response);

+        }

+    }

+    if (lynq_gpio_arr[0] == 0)

+    {

+        handle_output("+GPIO:input all gpio not exist\r\n", strlen("input all gpio not exist\r\n"), Response);

+        return -1;

+    }

+    return size;

+}

+

+#define GPIO_FILE "/data/factory/gpio_L805.conf"

+int load_gpio(int *lynq_gpio_total_arr)

+{

+    FILE *fp;

+    char StrLine[512];

+    char StrGpio[512];

+    char platform[10] = {0};

+    char total[10] = {0};

+    int count = 0;

+    if((fp = fopen(GPIO_FILE, "r")) == NULL)

+    {

+        RLOGE("open %s error!\n", GPIO_FILE);

+        return -1;

+    }

+    while (!feof(fp))

+    {

+        memset(StrLine, 0, 512);

+        fgets(StrLine, 512, fp);

+        if(strstr(StrLine, "platform:") != NULL)

+        {

+            strcpy(platform, strstr(StrLine, "platform:") + sizeof("platform:") - 1);

+            if(!strcmp(platform,"L805"))

+            {

+                RLOGE("platform:error\n");

+                fclose(fp);

+                return -1;

+            }

+            RLOGE("platform:%s\n",platform);

+        }

+        

+        else if(strstr(StrLine, "total:") != NULL)

+        {

+            strcpy(total, strstr(StrLine, "total:") + sizeof("total:") - 1);

+            RLOGE("total:%s\n",total);

+        }

+        

+        else if((strstr(StrLine, "gpio:") != NULL))

+        {

+            strcpy(StrGpio, strstr(StrLine, "gpio:") + sizeof("gpio:") - 1);

+            for(int i=0; StrGpio[i] != '\0'; i++)

+            {

+                int num = 0;

+                for (; StrGpio[i] != ',' && StrGpio[i] != '\0' && StrGpio[i] != '\n'; i++)

+                {

+                    num = num * 10 + (StrGpio[i] - '0');

+                }

+                lynq_gpio_total_arr[count] = num;

+                count++;

+            }

+            break;

+

+        }

+    }

+    fclose(fp);

+    return count;

+}

+

+/*GPIO 6 is Used for comparison*/

+static int set_all_gpio_status_and_check(int lynq_gpio_arr[], int status, int total_length)

+{

+    int ret;

+    

+    for(int m = 0; m < total_length; m++)

+    {

+        gpio_init(lynq_gpio_arr[m], 0, status);

+    }

+    usleep(10000);

+    ret = gpio_status_get();

+    if(ret!= status)

+    {

+        RLOGE("gpio status error\n");

         return 1;

     }

-    //usleep(10000);

     return 0;

 }

 

 void lynq_handle_gpio(char *input)

 {

-    FILE *fp;

-    int lynq_gpio_arr[85] = {230,231,232,233,234,102,104,103,101,186 ,188 ,187 ,185 ,194 ,196 ,195 ,193 ,205 ,204 ,203 ,202, 201 ,190 ,192 ,191 ,189 ,173 ,174 ,175 ,176 ,170 ,169 ,184 ,183 ,182 ,181 ,24 ,25 ,157 ,158 ,155 ,156 ,143 ,144 ,140 ,141 ,153 ,154 ,180 ,179 ,29 ,30 ,178, 177, 7 ,5 ,4 ,113 ,112, 116 ,115 ,114, 107, 108, 105, 106, 100 ,99 ,98, 97, 94, 93, 92, 91, 1 ,130 ,41 ,67 ,69, 68, 63, 22, 23, 199, 200};

-    char lynq_set_gpio_arr[256] = {0};

-    char lynq_get_gpio_state[512] = {0};

+    int lynq_gpio_total_arr[256];

+    int lynq_gpio_arr[256] = {0};

     char lynq_show_gpio_state[64] = {0};

     int lynq_gpio_low = 0;

-    int lynq_gpio_hig = 0;

+    int lynq_gpio_high = 0;

+    int total_length = 0;

+    int valid_length = 0;

+    int value;

+    int ret;

     int lynq_gpio_test_env_error = 1;

     int i = 0,m = 0,j = 0;

     int need_int = 1;

     int lynq_gpio_beta_state = 1;

-    RLOGD("start function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

-    

-    for(i=0; i < 85; i++)

-    {

 

+    if((total_length = load_gpio(lynq_gpio_total_arr)) < 0)

+    {

+        RLOGE("Don't have this platform gpio configure\n");

+        return;

+    }

+    gpio_set_commond(6, "mode", 0);

+    gpio_set_commond(6, "dir", 0);

+    RLOGE("start function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+    input = input + strlen("gpio");

+    if((valid_length = lynq_gpio_analysis(input, lynq_gpio_arr, lynq_gpio_total_arr, total_length)) < 0)

+    {

+        lynq_response_error(100);

+        return;

+    }

+    RLOGE("The Valid count:%d\n",valid_length);

+    for(i=0; i < valid_length; i++)

+    {

         for(j=0;j<3;j++)

         {

             if  (j > 0) // reset gpio when retry

@@ -273,85 +414,73 @@
 

             if (need_int == 1)

             {

-                if (set_all_gpio_status_and_check(lynq_gpio_arr, '0') != 0)

+                ret = set_all_gpio_status_and_check(lynq_gpio_arr, 0, valid_length);

+                if (ret == 1)

                 {

+                    RLOGE("can't pull up or pull down gpio-6\n");

                     continue;

                 }

-                else

+                else if(ret == 0)

                 {

+                    RLOGE("all gpio can pull up or pull dpwn\n");

                     need_int = 0;

                 }

-                RLOGD("finsh peizhi function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                else if(ret == -1)

+                {

+                    RLOGE("gpio init or uninit fail\n");

+                    lynq_response_error(100);

+                    return;

+                }

+                RLOGE("finsh configure function\n");  

             }

 

             lynq_gpio_low = 0;

-            lynq_gpio_hig = 0;

+            lynq_gpio_high = 0;

 

             for(int n=0;n<3;n++)

             {

-                bzero(lynq_set_gpio_arr, 256);

-                sprintf(lynq_set_gpio_arr,"echo mode %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-                system(lynq_set_gpio_arr);

-

-                bzero(lynq_set_gpio_arr, 256);

-                sprintf(lynq_set_gpio_arr,"echo out %d 1 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-                system(lynq_set_gpio_arr);

-

-

-                bzero(lynq_set_gpio_arr, 256);

-                sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

-                fp=popen(lynq_set_gpio_arr, "r");

-                bzero(lynq_get_gpio_state, 512);

-                fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

-                pclose(fp);

-                if(lynq_get_gpio_state[7] == '1')

+                gpio_set_commond(lynq_gpio_arr[i], "out", 1);

+                usleep(10000);

+                value = gpio_status_get();

+                if(value == 1)

                 {

-                    RLOGD("high function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

-                    lynq_gpio_hig = 1;

+                    RLOGE("high function is OK,input %d\n",lynq_gpio_arr[i]);

+                    lynq_gpio_high = 1;

                     lynq_gpio_test_env_error = 0;

                     break;

                 }

                 else

                 {

-                    RLOGD("high function %s line %d input %s num %d\n", __FUNCTION__, __LINE__, input,lynq_gpio_arr[i]);

+                    RLOGE("high function is Fail, input %d\n",lynq_gpio_arr[i]);

                     if(i == 0 && j == 0)

                     {

-

-                        lynq_gpio_test_env_error = set_all_gpio_status_and_check(lynq_gpio_arr, '1') == 0 ? 0 : 1;

+                        lynq_gpio_test_env_error = set_all_gpio_status_and_check(lynq_gpio_arr, 1, valid_length) == 0 ? 0 : 1;

                     }

-

                 }

             }

             if (lynq_gpio_test_env_error == 1)

                 break;

-            bzero(lynq_set_gpio_arr, 256);

-            sprintf(lynq_set_gpio_arr,"echo out %d 0 > /sys/devices/platform/10005000.pinctrl/mt_gpio",(char*)lynq_gpio_arr[i]);

-            system(lynq_set_gpio_arr);

-            

-            bzero(lynq_set_gpio_arr, 256);

-            sprintf(lynq_set_gpio_arr,"cat /sys/devices/platform/10005000.pinctrl/mt_gpio | grep 006");

-            fp=popen(lynq_set_gpio_arr, "r");

-            bzero(lynq_get_gpio_state, 512);

-            fgets(lynq_get_gpio_state,sizeof(lynq_get_gpio_state),fp);

-            pclose(fp);

-            if(lynq_get_gpio_state[7] == '0')

+            gpio_set_commond(lynq_gpio_arr[i], "out", 0);

+            usleep(10000);

+            value = gpio_status_get();

+            if(value == 0)

             {

-                RLOGI("*low function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                RLOGE("low function is OK,input %d\n",lynq_gpio_arr[i]);

                 lynq_gpio_low = 1;

             }

             else

             {

-                RLOGD("low function fail %s line %d input %s num %d\n", __FUNCTION__, __LINE__, input,lynq_gpio_arr[i]);

+                RLOGE("low function is fail,input %d\n",lynq_gpio_arr[i]);

             }

             bzero(lynq_show_gpio_state, 64);

-            if((lynq_gpio_low != 1) || (lynq_gpio_hig != 1))

+            if((lynq_gpio_low != 1) || (lynq_gpio_high != 1))

             {

-                RLOGD("fail function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+                RLOGE("total fail function,input %d\n",lynq_gpio_arr[i]);

             }

             else

             {

-                RLOGD("success function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

-                sprintf(lynq_show_gpio_state,"gpio%d\n",(char *)lynq_gpio_arr[i]);

+                RLOGE("success function,input:%d\n",lynq_gpio_arr[i]);

+                sprintf(lynq_show_gpio_state,"+GPIO:%d\r\n",lynq_gpio_arr[i]);

                 handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);

                 break; // do not retry when pass

             }

@@ -364,25 +493,27 @@
         if (j >= 3 )

         {

             lynq_gpio_beta_state = 0;

-            sprintf(lynq_show_gpio_state,"[gpio%d][result]:FAIL \n",(char *)lynq_gpio_arr[i]);

+            sprintf(lynq_show_gpio_state,"+GPIO:%d FAIL\r\n",lynq_gpio_arr[i]);

             handle_output(lynq_show_gpio_state, strlen(lynq_show_gpio_state), Response);

         }

-

-    } // for(i=0; i < 85; i++)

+    } // for(i=0; i < sizeof(lynq_gpio_arr)/sizeof(lynq_gpio_arr[0]); i++)

 

     if(lynq_gpio_test_env_error == 1)

     {

-        handle_output("tool error", strlen("tool error"), Response);

+        RLOGE("tool error\n");

+        handle_output("+GPIO:tool error\r\n", strlen("+GPIO:tool error\r\n"), Response);

+        lynq_response_error(100);

+        return;

     }

 

     if(lynq_gpio_beta_state == 1)

     {

-        RLOGD("total success function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+        RLOGE("total success function\n");

         lynq_response_ok();

     }

     else

     {

-        RLOGD("total fail function %s line %d input %s\n", __FUNCTION__, __LINE__, input);

+        RLOGE("total fail function\n");

         lynq_response_error(100);

     }

 }