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