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