xref: /OK3568_Linux_fs/external/recovery/usbboot.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 "usbboot.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_udisk(void)31*4882a593Smuzhiyun bool is_boot_from_udisk(void)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun     bool bUDisk = 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, "usbfwupdate");
44*4882a593Smuzhiyun     if (s != NULL) {
45*4882a593Smuzhiyun         bUDisk = true;
46*4882a593Smuzhiyun         LOGI(">>> Boot from U-Disk\n");
47*4882a593Smuzhiyun     } else {
48*4882a593Smuzhiyun         bUDisk = false;
49*4882a593Smuzhiyun         LOGI(">>> Boot from non-U-Disk\n");
50*4882a593Smuzhiyun     }
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun     close(fd);
53*4882a593Smuzhiyun     return bUDisk;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun 
ensure_udisk_mounted(bool * bMounted)56*4882a593Smuzhiyun void ensure_udisk_mounted(bool *bMounted)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun     int i;
59*4882a593Smuzhiyun     bool bSucc = false;
60*4882a593Smuzhiyun     for (i = 0; i < 3; i++) {
61*4882a593Smuzhiyun         if (0 == ensure_path_mounted(EX_UDISK_ROOT)) {
62*4882a593Smuzhiyun             *bMounted = true;
63*4882a593Smuzhiyun             bSucc = true;
64*4882a593Smuzhiyun             break;
65*4882a593Smuzhiyun         } else {
66*4882a593Smuzhiyun             LOGI("delay 1 sec to try /mnt/udisk\n");
67*4882a593Smuzhiyun             sleep(1);
68*4882a593Smuzhiyun         }
69*4882a593Smuzhiyun     }
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun     if (!bSucc) {   // try another mount point
72*4882a593Smuzhiyun         for (i = 0; i < 3; i++) {
73*4882a593Smuzhiyun             if (0 == ensure_path_mounted(EX_UDISK_ROOT2)) {
74*4882a593Smuzhiyun                 *bMounted = true;
75*4882a593Smuzhiyun                 bSucc = true;
76*4882a593Smuzhiyun                 break;
77*4882a593Smuzhiyun             } else {
78*4882a593Smuzhiyun                 LOGI("delay 1 sec to try /mnt/usb_storage\n");
79*4882a593Smuzhiyun                 sleep(1);
80*4882a593Smuzhiyun             }
81*4882a593Smuzhiyun         }
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun     if (bSucc)
85*4882a593Smuzhiyun         *bMounted = false;
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun #define MaxLine 1024
get_cfg_Item(char * pFileName,char * pKey,char * pValue,int * pValueLen)89*4882a593Smuzhiyun static int get_cfg_Item(char *pFileName /*in*/, char *pKey /*in*/,
90*4882a593Smuzhiyun                         char * pValue/*in out*/, int * pValueLen /*out*/)
91*4882a593Smuzhiyun {
92*4882a593Smuzhiyun     int     ret = 0;
93*4882a593Smuzhiyun     FILE    *fp = NULL;
94*4882a593Smuzhiyun     char    *pTmp = NULL, *pEnd = NULL, *pBegin = NULL;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun     char lineBuf[MaxLine];
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     fp = fopen(pFileName, "r");
99*4882a593Smuzhiyun     if (fp == NULL) {
100*4882a593Smuzhiyun         ret = -1;
101*4882a593Smuzhiyun         return ret;
102*4882a593Smuzhiyun     }
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun     while (!feof(fp)) {
105*4882a593Smuzhiyun         memset(lineBuf, 0, sizeof(lineBuf));
106*4882a593Smuzhiyun         fgets(lineBuf, MaxLine, fp);
107*4882a593Smuzhiyun         LOGI("lineBuf: %s ", lineBuf);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun         pTmp = strchr(lineBuf, '=');
110*4882a593Smuzhiyun         if (pTmp == NULL)
111*4882a593Smuzhiyun             continue;
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun         pTmp = strstr(lineBuf, pKey);
114*4882a593Smuzhiyun         if (pTmp == NULL)
115*4882a593Smuzhiyun             continue;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun         pTmp = pTmp + strlen(pKey);
118*4882a593Smuzhiyun         pTmp = strchr(pTmp, '=');
119*4882a593Smuzhiyun         if (pTmp == NULL)
120*4882a593Smuzhiyun             continue;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun         pTmp = pTmp + 1;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun         while (1) {
125*4882a593Smuzhiyun             if (*pTmp == ' ') {
126*4882a593Smuzhiyun                 pTmp ++ ;
127*4882a593Smuzhiyun             } else {
128*4882a593Smuzhiyun                 pBegin = pTmp;
129*4882a593Smuzhiyun                 if (*pBegin == '\n') {
130*4882a593Smuzhiyun                     goto End;
131*4882a593Smuzhiyun                 }
132*4882a593Smuzhiyun                 break;
133*4882a593Smuzhiyun             }
134*4882a593Smuzhiyun         }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun         while (1) {
137*4882a593Smuzhiyun             if ((*pTmp == ' ' || *pTmp == '\n'))
138*4882a593Smuzhiyun                 break;
139*4882a593Smuzhiyun             else
140*4882a593Smuzhiyun                 pTmp ++;
141*4882a593Smuzhiyun         }
142*4882a593Smuzhiyun         pEnd = pTmp;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun         *pValueLen = pEnd - pBegin;
145*4882a593Smuzhiyun         memcpy(pValue, pBegin, pEnd - pBegin);
146*4882a593Smuzhiyun     }
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun End:
149*4882a593Smuzhiyun     if (fp == NULL)
150*4882a593Smuzhiyun         fclose(fp);
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun     return 0;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
is_udisk_update(void)155*4882a593Smuzhiyun bool is_udisk_update(void)
156*4882a593Smuzhiyun {
157*4882a593Smuzhiyun     int  ret = 0;
158*4882a593Smuzhiyun     bool bUdiskMounted = false;
159*4882a593Smuzhiyun     char configFile[64] = {0};
160*4882a593Smuzhiyun     int vlen = 0;
161*4882a593Smuzhiyun     char str_val[10] = {0};
162*4882a593Smuzhiyun     char *str_key = "fw_update";
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun     LOGI("%s in\n", __func__);
165*4882a593Smuzhiyun     ensure_udisk_mounted(&bUdiskMounted);
166*4882a593Smuzhiyun     if (!bUdiskMounted) {
167*4882a593Smuzhiyun         LOGI("Error! U-Disk not mounted\n");
168*4882a593Smuzhiyun         return false;
169*4882a593Smuzhiyun     }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun     strlcpy(configFile, EX_UDISK_ROOT, sizeof(configFile));
172*4882a593Smuzhiyun     strlcat(configFile, "/sd_boot_config.config", sizeof(configFile));
173*4882a593Smuzhiyun     LOGI("configFile = %s \n", configFile);
174*4882a593Smuzhiyun     ret = get_cfg_Item(configFile, str_key, str_val, &vlen);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun     if (ret != 0) {
177*4882a593Smuzhiyun         LOGI("func get_cfg_Item err:%d \n", ret);
178*4882a593Smuzhiyun         return false;
179*4882a593Smuzhiyun     }
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun     LOGI("\n %s:%s \n", str_key, str_val);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun     if (strcmp(str_val, "1") != 0) {
184*4882a593Smuzhiyun         return false;
185*4882a593Smuzhiyun     }
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun     LOGI("firmware update will from UDisk.\n");
188*4882a593Smuzhiyun     LOGI("%s out\n", __func__);
189*4882a593Smuzhiyun     return true;
190*4882a593Smuzhiyun }
191