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