xref: /OK3568_Linux_fs/external/recovery/sdboot.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /**
2*4882a593Smuzhiyun  * Copyright (C) 2018 Fuzhou Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  * author: Chad.ma <Chad.ma@rock-chips.com>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This software is licensed under the terms of the GNU General Public
6*4882a593Smuzhiyun  * License version 2, as published by the Free Software Foundation, and
7*4882a593Smuzhiyun  * may be copied, distributed, and modified under those terms.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful,
10*4882a593Smuzhiyun  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11*4882a593Smuzhiyun  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12*4882a593Smuzhiyun  * GNU General Public License for more details.
13*4882a593Smuzhiyun  */
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <fcntl.h>
16*4882a593Smuzhiyun #include <stdio.h>
17*4882a593Smuzhiyun #include <stdlib.h>
18*4882a593Smuzhiyun #include <string.h>
19*4882a593Smuzhiyun #include <stdbool.h>
20*4882a593Smuzhiyun #include <unistd.h>
21*4882a593Smuzhiyun #include <sys/stat.h>
22*4882a593Smuzhiyun #include <sys/types.h>
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #include "roots.h"
25*4882a593Smuzhiyun #include "sdboot.h"
26*4882a593Smuzhiyun #include "common.h"
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun extern size_t strlcpy(char *dst, const char *src, size_t dsize);
29*4882a593Smuzhiyun extern size_t strlcat(char *dst, const char *src, size_t dsize);
30*4882a593Smuzhiyun 
is_boot_from_SD(void)31*4882a593Smuzhiyun bool is_boot_from_SD(void)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun     bool bSDBoot = false;
34*4882a593Smuzhiyun     char param[1024];
35*4882a593Smuzhiyun     int fd, ret;
36*4882a593Smuzhiyun     char *s = NULL;
37*4882a593Smuzhiyun     LOGI("read cmdline\n");
38*4882a593Smuzhiyun     memset(param, 0, 1024);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun     fd = open("/proc/cmdline", O_RDONLY);
41*4882a593Smuzhiyun     ret = read(fd, (char*)param, 1024);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun     s = strstr(param, "sdfwupdate");
44*4882a593Smuzhiyun     if (s != NULL) {
45*4882a593Smuzhiyun         bSDBoot = true;
46*4882a593Smuzhiyun         LOGI(">>> Boot from SDcard\n");
47*4882a593Smuzhiyun     } else {
48*4882a593Smuzhiyun         bSDBoot = false;
49*4882a593Smuzhiyun         LOGI(">>> Boot from non-SDcard\n");
50*4882a593Smuzhiyun     }
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun     close(fd);
53*4882a593Smuzhiyun     return bSDBoot;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
ensure_sd_mounted(bool * bSDMounted)56*4882a593Smuzhiyun void ensure_sd_mounted(bool *bSDMounted)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun     int i;
59*4882a593Smuzhiyun     for (i = 0; i < 3; i++) {
60*4882a593Smuzhiyun         if (0 == ensure_path_mounted(EX_SDCARD_ROOT)) {
61*4882a593Smuzhiyun             *bSDMounted = true;
62*4882a593Smuzhiyun             break;
63*4882a593Smuzhiyun         } else {
64*4882a593Smuzhiyun             LOGI("delay 1sec\n");
65*4882a593Smuzhiyun             sleep(1);
66*4882a593Smuzhiyun         }
67*4882a593Smuzhiyun     }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun     if (i == 3)
70*4882a593Smuzhiyun         *bSDMounted = false;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define MaxLine 1024
get_cfg_Item(char * pFileName,char * pKey,char * pValue,int * pValueLen)74*4882a593Smuzhiyun static int get_cfg_Item(char *pFileName /*in*/, char *pKey /*in*/,
75*4882a593Smuzhiyun                         char * pValue/*in out*/, int * pValueLen /*out*/)
76*4882a593Smuzhiyun {
77*4882a593Smuzhiyun     int     ret = 0;
78*4882a593Smuzhiyun     FILE    *fp = NULL;
79*4882a593Smuzhiyun     char    *pTmp = NULL, *pEnd = NULL, *pBegin = NULL;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun     char lineBuf[MaxLine];
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun     fp = fopen(pFileName, "r");
84*4882a593Smuzhiyun     if (fp == NULL) {
85*4882a593Smuzhiyun         ret = -1;
86*4882a593Smuzhiyun         return ret;
87*4882a593Smuzhiyun     }
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun     while (!feof(fp)) {
90*4882a593Smuzhiyun         memset(lineBuf, 0, sizeof(lineBuf));
91*4882a593Smuzhiyun         fgets(lineBuf, MaxLine, fp);
92*4882a593Smuzhiyun         LOGI("lineBuf: %s ", lineBuf);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun         pTmp = strchr(lineBuf, '=');
95*4882a593Smuzhiyun         if (pTmp == NULL)
96*4882a593Smuzhiyun             continue;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun         pTmp = strstr(lineBuf, pKey);
99*4882a593Smuzhiyun         if (pTmp == NULL)
100*4882a593Smuzhiyun             continue;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun         pTmp = pTmp + strlen(pKey);
103*4882a593Smuzhiyun         pTmp = strchr(pTmp, '=');
104*4882a593Smuzhiyun         if (pTmp == NULL)
105*4882a593Smuzhiyun             continue;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun         pTmp = pTmp + 1;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun         while (1) {
110*4882a593Smuzhiyun             if (*pTmp == ' ') {
111*4882a593Smuzhiyun                 pTmp ++ ;
112*4882a593Smuzhiyun             } else {
113*4882a593Smuzhiyun                 pBegin = pTmp;
114*4882a593Smuzhiyun                 if (*pBegin == '\n') {
115*4882a593Smuzhiyun                     goto End;
116*4882a593Smuzhiyun                 }
117*4882a593Smuzhiyun                 break;
118*4882a593Smuzhiyun             }
119*4882a593Smuzhiyun         }
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun         while (1) {
122*4882a593Smuzhiyun             if ((*pTmp == ' ' || *pTmp == '\n'))
123*4882a593Smuzhiyun                 break;
124*4882a593Smuzhiyun             else
125*4882a593Smuzhiyun                 pTmp ++;
126*4882a593Smuzhiyun         }
127*4882a593Smuzhiyun         pEnd = pTmp;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun         *pValueLen = pEnd - pBegin;
130*4882a593Smuzhiyun         memcpy(pValue, pBegin, pEnd - pBegin);
131*4882a593Smuzhiyun     }
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun End:
134*4882a593Smuzhiyun     if (fp == NULL)
135*4882a593Smuzhiyun         fclose(fp);
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun     return 0;
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun 
is_sdcard_update(void)140*4882a593Smuzhiyun bool is_sdcard_update(void)
141*4882a593Smuzhiyun {
142*4882a593Smuzhiyun     int  ret = 0;
143*4882a593Smuzhiyun     bool bSdMounted = false;
144*4882a593Smuzhiyun     char configFile[64] = {0};
145*4882a593Smuzhiyun     int vlen = 0;
146*4882a593Smuzhiyun     char str_val[10] = {0};
147*4882a593Smuzhiyun     char *str_key = "fw_update";
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun     LOGI("%s in\n", __func__);
150*4882a593Smuzhiyun     ensure_sd_mounted(&bSdMounted);
151*4882a593Smuzhiyun     if (!bSdMounted) {
152*4882a593Smuzhiyun         LOGE("Error! SDcard not mounted\n");
153*4882a593Smuzhiyun         return false;
154*4882a593Smuzhiyun     }
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun     strlcpy(configFile, EX_SDCARD_ROOT, sizeof(configFile));
157*4882a593Smuzhiyun     strlcat(configFile, "/sd_boot_config.config", sizeof(configFile));
158*4882a593Smuzhiyun     LOGI("configFile = %s \n", configFile);
159*4882a593Smuzhiyun     ret = get_cfg_Item(configFile, str_key, str_val, &vlen);
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun     if (ret != 0) {
162*4882a593Smuzhiyun         LOGI("func get_cfg_Item err:%d \n", ret);
163*4882a593Smuzhiyun         return false;
164*4882a593Smuzhiyun     }
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun     LOGI("\n %s:%s \n", str_key, str_val);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun     if (strcmp(str_val, "1") != 0) {
169*4882a593Smuzhiyun         return false;
170*4882a593Smuzhiyun     }
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     LOGI("firmware update will from SDCARD. \n");
173*4882a593Smuzhiyun     LOGI("%s out\n", __func__);
174*4882a593Smuzhiyun     return true;
175*4882a593Smuzhiyun }
176