xref: /OK3568_Linux_fs/external/recovery/rktools.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2023 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Licensed under the Apache License, Version 2.0 (the "License");
5*4882a593Smuzhiyun  * you may not use this file except in compliance with the License.
6*4882a593Smuzhiyun  * You may obtain a copy of the License at
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *       http://www.apache.org/licenses/LICENSE-2.0
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * Unless required by applicable law or agreed to in writing, software
11*4882a593Smuzhiyun  * distributed under the License is distributed on an "AS IS" BASIS,
12*4882a593Smuzhiyun  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4882a593Smuzhiyun  * See the License for the specific language governing permissions and
14*4882a593Smuzhiyun  * limitations under the License.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #include <stdio.h>
18*4882a593Smuzhiyun #include <unistd.h>
19*4882a593Smuzhiyun #include <string.h>
20*4882a593Smuzhiyun #include <stdlib.h>
21*4882a593Smuzhiyun #include <stdbool.h>
22*4882a593Smuzhiyun #include <sys/types.h>
23*4882a593Smuzhiyun #include <sys/stat.h>
24*4882a593Smuzhiyun #include <fcntl.h>
25*4882a593Smuzhiyun #include <pthread.h>
26*4882a593Smuzhiyun #include <sys/types.h>
27*4882a593Smuzhiyun #include <dirent.h>
28*4882a593Smuzhiyun #include <stdio.h>
29*4882a593Smuzhiyun #include <sys/stat.h>
30*4882a593Smuzhiyun #include <fcntl.h>
31*4882a593Smuzhiyun #include <errno.h>
32*4882a593Smuzhiyun #include <unistd.h>
33*4882a593Smuzhiyun #include "rktools.h"
34*4882a593Smuzhiyun #include "common.h"
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /**
37*4882a593Smuzhiyun  * 从/proc/cmdline 获取串口的节点
38*4882a593Smuzhiyun  *
39*4882a593Smuzhiyun */
getSerial()40*4882a593Smuzhiyun char *getSerial()
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun     char *ans = (char*)malloc(20);
43*4882a593Smuzhiyun     char param[1024];
44*4882a593Smuzhiyun     int fd, ret;
45*4882a593Smuzhiyun     char *s = NULL;
46*4882a593Smuzhiyun     fd = open("/proc/cmdline", O_RDONLY);
47*4882a593Smuzhiyun     ret = read(fd, (char*)param, 1024);
48*4882a593Smuzhiyun     LOGI("cmdline=%s\n", param);
49*4882a593Smuzhiyun     s = strstr(param, "console");
50*4882a593Smuzhiyun     if (s == NULL) {
51*4882a593Smuzhiyun         LOGI("no found console in cmdline\n");
52*4882a593Smuzhiyun         free(ans);
53*4882a593Smuzhiyun         ans = NULL;
54*4882a593Smuzhiyun         return ans;
55*4882a593Smuzhiyun     } else {
56*4882a593Smuzhiyun         s = strstr(s, "=");
57*4882a593Smuzhiyun         if (s == NULL) {
58*4882a593Smuzhiyun             free(ans);
59*4882a593Smuzhiyun             ans = NULL;
60*4882a593Smuzhiyun             return ans;
61*4882a593Smuzhiyun         }
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun         strcpy(ans, "/dev/");
64*4882a593Smuzhiyun         char *str = ans + 5;
65*4882a593Smuzhiyun         s++;
66*4882a593Smuzhiyun         while (*s != ' ') {
67*4882a593Smuzhiyun             *str = *s;
68*4882a593Smuzhiyun             str++;
69*4882a593Smuzhiyun             s++;
70*4882a593Smuzhiyun         }
71*4882a593Smuzhiyun         *str = '\0';
72*4882a593Smuzhiyun         LOGI("read console from cmdline is %s\n", ans);
73*4882a593Smuzhiyun     }
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun     return ans;
76*4882a593Smuzhiyun }
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun /**
79*4882a593Smuzhiyun  *  设置flash 节点
80*4882a593Smuzhiyun  */
81*4882a593Smuzhiyun static char result_point[4][20] = {'\0'}; //0-->emmc, 1-->sdcard, 2-->SDIO, 3-->SDcombo
readFile(DIR * dir,char * filename)82*4882a593Smuzhiyun int readFile(DIR* dir, char* filename)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun     char name[30] = {'\0'};
85*4882a593Smuzhiyun     int i;
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     strcpy(name, filename);
88*4882a593Smuzhiyun     strcat(name, "/type");
89*4882a593Smuzhiyun     int fd = openat(dirfd(dir), name, O_RDONLY);
90*4882a593Smuzhiyun     if (fd == -1) {
91*4882a593Smuzhiyun         LOGE("Error: openat %s error %s.\n", name, strerror(errno));
92*4882a593Smuzhiyun         return -1;
93*4882a593Smuzhiyun     }
94*4882a593Smuzhiyun     char resultBuf[10] = {'\0'};
95*4882a593Smuzhiyun     if (read(fd, resultBuf, sizeof(resultBuf)) < 1) {
96*4882a593Smuzhiyun         return -1;
97*4882a593Smuzhiyun     }
98*4882a593Smuzhiyun     for (i = 0; i < strlen(resultBuf); i++) {
99*4882a593Smuzhiyun         if (resultBuf[i] == '\n') {
100*4882a593Smuzhiyun             resultBuf[i] = '\0';
101*4882a593Smuzhiyun             break;
102*4882a593Smuzhiyun         }
103*4882a593Smuzhiyun     }
104*4882a593Smuzhiyun     for (i = 0; i < 4; i++) {
105*4882a593Smuzhiyun         if (strcmp(typeName[i], resultBuf) == 0) {
106*4882a593Smuzhiyun             //printf("type is %s.\n", typeName[i]);
107*4882a593Smuzhiyun             return i;
108*4882a593Smuzhiyun         }
109*4882a593Smuzhiyun     }
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     LOGE("Error:no found type!\n");
112*4882a593Smuzhiyun     return -1;
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
init_sd_emmc_point()115*4882a593Smuzhiyun void init_sd_emmc_point()
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     DIR* dir = opendir("/sys/bus/mmc/devices/");
118*4882a593Smuzhiyun     if (dir != NULL) {
119*4882a593Smuzhiyun         struct dirent* de;
120*4882a593Smuzhiyun         while ((de = readdir(dir))) {
121*4882a593Smuzhiyun             if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0 )
122*4882a593Smuzhiyun                 continue;
123*4882a593Smuzhiyun             //if (de->d_type == 4)    //dir
124*4882a593Smuzhiyun             //    printf("dir name : %s \n", de->d_name);
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun             if (strncmp(de->d_name, "mmc", 3) == 0) {
127*4882a593Smuzhiyun                 //printf("find mmc is %s.\n", de->d_name);
128*4882a593Smuzhiyun                 char flag = de->d_name[3];
129*4882a593Smuzhiyun                 int ret = -1;
130*4882a593Smuzhiyun                 ret = readFile(dir, de->d_name);
131*4882a593Smuzhiyun                 if (ret != -1) {
132*4882a593Smuzhiyun                     strcpy(result_point[ret], point_items[flag - '0']);
133*4882a593Smuzhiyun                 } else {
134*4882a593Smuzhiyun                     strcpy(result_point[ret], "");
135*4882a593Smuzhiyun                 }
136*4882a593Smuzhiyun             }
137*4882a593Smuzhiyun         }
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun     closedir(dir);
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
wait_for_device(const char * fn)142*4882a593Smuzhiyun static void wait_for_device(const char* fn)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun     int tries = 0;
145*4882a593Smuzhiyun     int ret;
146*4882a593Smuzhiyun     struct stat buf;
147*4882a593Smuzhiyun     do {
148*4882a593Smuzhiyun         ++tries;
149*4882a593Smuzhiyun         ret = stat(fn, &buf);
150*4882a593Smuzhiyun         if (ret) {
151*4882a593Smuzhiyun             LOGI("stat %s try %d: %s\n", fn, tries, strerror(errno));
152*4882a593Smuzhiyun             sleep(1);
153*4882a593Smuzhiyun         }
154*4882a593Smuzhiyun     } while (ret && tries < 10);
155*4882a593Smuzhiyun     if (ret) {
156*4882a593Smuzhiyun         LOGI("failed to stat %s\n", fn);
157*4882a593Smuzhiyun     }
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun 
setFlashPoint()160*4882a593Smuzhiyun void setFlashPoint()
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun     if (!isMtdDevice())
163*4882a593Smuzhiyun         wait_for_device(MISC_PARTITION_NAME_BLOCK);
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun     init_sd_emmc_point();
166*4882a593Smuzhiyun     setenv(EMMC_POINT_NAME, result_point[MMC], 1);
167*4882a593Smuzhiyun     //SDcard 有两个挂载点
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun     if (access(result_point[SD], F_OK) == 0)
170*4882a593Smuzhiyun         setenv(SD_POINT_NAME_2, result_point[SD], 1);
171*4882a593Smuzhiyun     char name_t[22];
172*4882a593Smuzhiyun     if (strlen(result_point[SD]) > 0) {
173*4882a593Smuzhiyun         strcpy(name_t, result_point[SD]);
174*4882a593Smuzhiyun         strcat(name_t, "p1");
175*4882a593Smuzhiyun     }
176*4882a593Smuzhiyun     if (access(name_t, F_OK) == 0)
177*4882a593Smuzhiyun         setenv(SD_POINT_NAME, name_t, 1);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun     LOGI("emmc_point is %s\n", getenv(EMMC_POINT_NAME));
180*4882a593Smuzhiyun     LOGI("sd_point is %s\n", getenv(SD_POINT_NAME));
181*4882a593Smuzhiyun     LOGI("sd_point_2 is %s\n", getenv(SD_POINT_NAME_2));
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define MTD_PATH "/proc/mtd"
185*4882a593Smuzhiyun //判断是MTD还是block 设备
isMtdDevice()186*4882a593Smuzhiyun bool isMtdDevice()
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun     char param[2048];
189*4882a593Smuzhiyun     int fd, ret;
190*4882a593Smuzhiyun     char *s = NULL;
191*4882a593Smuzhiyun     fd = open("/proc/cmdline", O_RDONLY);
192*4882a593Smuzhiyun     ret = read(fd, (char*)param, 2048);
193*4882a593Smuzhiyun     close(fd);
194*4882a593Smuzhiyun     s = strstr(param, "storagemedia");
195*4882a593Smuzhiyun     if (s == NULL) {
196*4882a593Smuzhiyun         LOGI("no found storagemedia in cmdline, default is not MTD.\n");
197*4882a593Smuzhiyun         return false;
198*4882a593Smuzhiyun     } else {
199*4882a593Smuzhiyun         s = strstr(s, "=");
200*4882a593Smuzhiyun         if (s == NULL) {
201*4882a593Smuzhiyun             LOGI("no found storagemedia in cmdline, default is not MTD.\n");
202*4882a593Smuzhiyun             return false;
203*4882a593Smuzhiyun         }
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun         s++;
206*4882a593Smuzhiyun         while (*s == ' ') {
207*4882a593Smuzhiyun             s++;
208*4882a593Smuzhiyun         }
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun         if (strncmp(s, "mtd", 3) == 0 ) {
211*4882a593Smuzhiyun             LOGI("Now is MTD.\n");
212*4882a593Smuzhiyun             return true;
213*4882a593Smuzhiyun         } else if (strncmp(s, "sd", 2) == 0) {
214*4882a593Smuzhiyun             LOGI("Now is SD.\n");
215*4882a593Smuzhiyun             if ( !access(MTD_PATH, F_OK) ) {
216*4882a593Smuzhiyun                 fd = open(MTD_PATH, O_RDONLY);
217*4882a593Smuzhiyun                 ret = read(fd, (char*)param, 2048);
218*4882a593Smuzhiyun                 close(fd);
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun                 s = strstr(param, "mtd");
221*4882a593Smuzhiyun                 if (s == NULL) {
222*4882a593Smuzhiyun                     LOGI("no found mtd.\n");
223*4882a593Smuzhiyun                     return false;
224*4882a593Smuzhiyun                 }
225*4882a593Smuzhiyun                 LOGI("Now is MTD.\n");
226*4882a593Smuzhiyun                 return true;
227*4882a593Smuzhiyun             }
228*4882a593Smuzhiyun         }
229*4882a593Smuzhiyun     }
230*4882a593Smuzhiyun     LOGI("devices is not MTD.\n");
231*4882a593Smuzhiyun     return false;
232*4882a593Smuzhiyun }
233