linuxOS_AP05/external/recovery/rktools.c
2025-06-02 13:59:07 +08:00

209 lines
5.2 KiB
C

#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);
printf("cmdline=%s\n",param);
s = strstr(param,"console");
if(s == NULL){
printf("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';
printf("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){
printf("Error: openat %s error %s.\n", name, strerror(errno));
return -1;
}
char resultBuf[10] = {'\0'};
read(fd, resultBuf, sizeof(resultBuf));
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;
}
}
printf("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) {
printf("stat %s try %d: %s\n", fn, tries, strerror(errno));
sleep(1);
}
} while (ret && tries < 10);
if (ret) {
printf("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);
printf("emmc_point is %s\n", getenv(EMMC_POINT_NAME));
printf("sd_point is %s\n", getenv(SD_POINT_NAME));
printf("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){
printf("no found storagemedia in cmdline, default is not MTD.\n");
return false;
}else{
s = strstr(s, "=");
if (s == NULL) {
printf("no found storagemedia in cmdline, default is not MTD.\n");
return -1;
}
s++;
while (*s == ' ') {
s++;
}
if (strncmp(s, "mtd", 3) == 0 ) {
printf("Now is MTD.\n");
return true;
} else if (strncmp(s, "sd", 2) == 0) {
printf("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;
}