/* * emmc_test.c -- emmc test application * * Copyright (c) 2017 Rockchip Electronics Co. Ltd. * Author: Panzhenzhuan Wang * * 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 #include #include #include #include #include #include #include "test_case.h" #include "emmc_test.h" #include "language.h" #include "common.h" #define TAG "[PCBA,EMMC]: " #define LOG(x...) printf(TAG x) // #ifdef PCBA_PX3SE #define EMMCPATH "/sys/bus/mmc/devices/mmc0:1234/block/mmcblk0/size" #else #define EMMCPATH "/sys/bus/mmc/devices/mmc0:0001/block/mmcblk0/size" #endif #define EMMCPATH1 "/sys/bus/mmc/devices/mmc1:0001/block/mmcblk1/size" #define READ_DDR_COMMAND "cat /proc/zoneinfo | busybox grep present | \ busybox awk 'BEGIN{a=0}{a+=$2}END{print a}'" #define RKNAND_TEST_CMD "cat /proc/rknand > %s" #define RKNAND_TEST_FILE "/tmp/rknand_test.txt" /* for emmc */ static int readFromFile(const char *path, char *emmcsize_char, size_t size) { if (!path) return -1; int fd = open(path, O_RDONLY|O_NOCTTY|O_NDELAY, 0); if (fd == -1) { printf("open '%s' failed!\n", path); return -1; } ssize_t count = read(fd, emmcsize_char, size); //¼ÆËã³öÓÐЧµÄ×Ö·û×Ö½ÚÊý if (count > 0) { while (count > 0 && emmcsize_char[count-1] == '\n') count--; emmcsize_char[count] = '\0'; } else { emmcsize_char[0] = '\0'; } close(fd); return count; } int get_emmc_size(char *size_data) { int count; int emmc_size=1; double size = (double)(atoi(size_data))/2/1024/1024; //ÐèÒª #include if (size > 0 && size <= 1) /*1 GB */ return 1; for (count = 1; count < 10; count++) { if ((size > emmc_size) && (size <= emmc_size*2)) /*2 - 512 GB*/ return emmc_size*2; emmc_size *=2; } return -1; } #ifdef PCBA_PX3SE//emmc void *emmc_test(void *argv) { struct testcase_info *tc_info = (struct testcase_info *)argv; int emmc_ret = 0; char emmcsize_char[20]; int emmc_size = 0; char cmd[128]; if (tc_info->y <= 0) tc_info->y = get_cur_print_y(); ui_print_xy_rgba(0, tc_info->y, 255, 255, 0, 255, "%s:[%s..]\n", PCBA_DDR_EMMC, PCBA_TESTING); LOG("======= emmc test starting ========\n"); //sprintf(cmd,"aplay %s/emmc_test_start.wav",AUDIO_PATH); //system(cmd); //system("aplay /data/test/emmc_test_start.wav"); /* For emmc */ memset(emmcsize_char, 0, sizeof(emmcsize_char)); emmc_ret = readFromFile(EMMCPATH, emmcsize_char, sizeof(emmcsize_char)); printf("readFromFile effective bytes is %d \n",emmc_ret); if (emmc_ret < 0) { emmc_ret = readFromFile(EMMCPATH1, emmcsize_char, sizeof(emmcsize_char)); } if (emmc_ret >= 0) { /*read back normal*/ emmc_size = get_emmc_size(emmcsize_char); if(emmc_size < 0){ emmc_ret = -1; } LOG("======= emmc_size is: %d GB ========\n",emmc_size); } if (emmc_ret >= 0) { ui_print_xy_rgba(0, tc_info->y, 0, 255, 0, 255, "%s:[%s] { %s:%dGB }\n", PCBA_EMMC, PCBA_SECCESS, PCBA_EMMC, emmc_size); tc_info->result = 1; } else { ui_print_xy_rgba(0, tc_info->y, 0, 255, 0, 255, "%s:[%s] { %s: Get capacity Fail.}\n", PCBA_EMMC, PCBA_FAILED, PCBA_EMMC); tc_info->result = -1; } return argv; } #endif #ifdef PCBA_3308 void *emmc_test(void *argv) { char cmd[128]; char buf[128]; FILE *fp; int emmc_ret = -1; printf("======= emmc test starting ========\n"); sprintf(cmd,RKNAND_TEST_CMD,RKNAND_TEST_FILE); system(cmd); printf("cmd is: %s.\n",cmd); sleep(1); fp = fopen(RKNAND_TEST_FILE, "r"); //Èç¹ûÎļþ´ò¿ªÊ§°Ü£¬ÔòÊä³ö´íÎóÐÅÏ¢ if (!fp) { printf("%s fopen err:%s\n",__func__,strerror(errno)); return (void*)-1; } //¼ì²âÊÇ·ñ°üº¬ "Device Capacity: 4096 MB"ÐÅÏ¢£¬Èç¹ûÓÐ˵Ã÷²âÊÔÕý³££¬·ñÔò²âÊÔʧ°Ü while(!feof(fp)) { fgets(buf,sizeof(buf),fp); if(strstr(buf,"Device Capacity: 256 MB")!=NULL) { emmc_ret = 0; break; } } fclose(fp); remove(RKNAND_TEST_FILE); printf("\n=================== function :%s finish======================\n",__func__); return (void*)emmc_ret; } #endif