2025-05-10 21:49:39 +08:00

233 lines
5.9 KiB
C

/*
* Copyright (C) 2023 Rockchip Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include "rktools.h"
#include "common.h"
/**
* 从/proc/cmdline 获取串口的节点
*
*/
char *getSerial()
{
char *ans = (char*)malloc(20);
char param[1024];
int fd, ret;
char *s = NULL;
fd = open("/proc/cmdline", O_RDONLY);
ret = read(fd, (char*)param, 1024);
LOGI("cmdline=%s\n", param);
s = strstr(param, "console");
if (s == NULL) {
LOGI("no found console in cmdline\n");
free(ans);
ans = NULL;
return ans;
} else {
s = strstr(s, "=");
if (s == NULL) {
free(ans);
ans = NULL;
return ans;
}
strcpy(ans, "/dev/");
char *str = ans + 5;
s++;
while (*s != ' ') {
*str = *s;
str++;
s++;
}
*str = '\0';
LOGI("read console from cmdline is %s\n", ans);
}
return ans;
}
/**
* 设置flash 节点
*/
static char result_point[4][20] = {'\0'}; //0-->emmc, 1-->sdcard, 2-->SDIO, 3-->SDcombo
int readFile(DIR* dir, char* filename)
{
char name[30] = {'\0'};
int i;
strcpy(name, filename);
strcat(name, "/type");
int fd = openat(dirfd(dir), name, O_RDONLY);
if (fd == -1) {
LOGE("Error: openat %s error %s.\n", name, strerror(errno));
return -1;
}
char resultBuf[10] = {'\0'};
if (read(fd, resultBuf, sizeof(resultBuf)) < 1) {
return -1;
}
for (i = 0; i < strlen(resultBuf); i++) {
if (resultBuf[i] == '\n') {
resultBuf[i] = '\0';
break;
}
}
for (i = 0; i < 4; i++) {
if (strcmp(typeName[i], resultBuf) == 0) {
//printf("type is %s.\n", typeName[i]);
return i;
}
}
LOGE("Error:no found type!\n");
return -1;
}
void init_sd_emmc_point()
{
DIR* dir = opendir("/sys/bus/mmc/devices/");
if (dir != NULL) {
struct dirent* de;
while ((de = readdir(dir))) {
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0 )
continue;
//if (de->d_type == 4) //dir
// printf("dir name : %s \n", de->d_name);
if (strncmp(de->d_name, "mmc", 3) == 0) {
//printf("find mmc is %s.\n", de->d_name);
char flag = de->d_name[3];
int ret = -1;
ret = readFile(dir, de->d_name);
if (ret != -1) {
strcpy(result_point[ret], point_items[flag - '0']);
} else {
strcpy(result_point[ret], "");
}
}
}
}
closedir(dir);
}
static void wait_for_device(const char* fn)
{
int tries = 0;
int ret;
struct stat buf;
do {
++tries;
ret = stat(fn, &buf);
if (ret) {
LOGI("stat %s try %d: %s\n", fn, tries, strerror(errno));
sleep(1);
}
} while (ret && tries < 10);
if (ret) {
LOGI("failed to stat %s\n", fn);
}
}
void setFlashPoint()
{
if (!isMtdDevice())
wait_for_device(MISC_PARTITION_NAME_BLOCK);
init_sd_emmc_point();
setenv(EMMC_POINT_NAME, result_point[MMC], 1);
//SDcard 有两个挂载点
if (access(result_point[SD], F_OK) == 0)
setenv(SD_POINT_NAME_2, result_point[SD], 1);
char name_t[22];
if (strlen(result_point[SD]) > 0) {
strcpy(name_t, result_point[SD]);
strcat(name_t, "p1");
}
if (access(name_t, F_OK) == 0)
setenv(SD_POINT_NAME, name_t, 1);
LOGI("emmc_point is %s\n", getenv(EMMC_POINT_NAME));
LOGI("sd_point is %s\n", getenv(SD_POINT_NAME));
LOGI("sd_point_2 is %s\n", getenv(SD_POINT_NAME_2));
}
#define MTD_PATH "/proc/mtd"
//判断是MTD还是block 设备
bool isMtdDevice()
{
char param[2048];
int fd, ret;
char *s = NULL;
fd = open("/proc/cmdline", O_RDONLY);
ret = read(fd, (char*)param, 2048);
close(fd);
s = strstr(param, "storagemedia");
if (s == NULL) {
LOGI("no found storagemedia in cmdline, default is not MTD.\n");
return false;
} else {
s = strstr(s, "=");
if (s == NULL) {
LOGI("no found storagemedia in cmdline, default is not MTD.\n");
return false;
}
s++;
while (*s == ' ') {
s++;
}
if (strncmp(s, "mtd", 3) == 0 ) {
LOGI("Now is MTD.\n");
return true;
} else if (strncmp(s, "sd", 2) == 0) {
LOGI("Now is SD.\n");
if ( !access(MTD_PATH, F_OK) ) {
fd = open(MTD_PATH, O_RDONLY);
ret = read(fd, (char*)param, 2048);
close(fd);
s = strstr(param, "mtd");
if (s == NULL) {
LOGI("no found mtd.\n");
return false;
}
LOGI("Now is MTD.\n");
return true;
}
}
}
LOGI("devices is not MTD.\n");
return false;
}