#include "product_test.h" #include "pt_sd.h" #define LOG_TAG_CONST PRODUCT_TEST #define LOG_TAG "[PRODUCT_TEST]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE #define LOG_CLI_ENABLE #include "debug.h" #if PT_SD_ENABLE && (TCFG_SD0_ENABLE || TCFG_SD1_ENABLE) static u8 pt_sd_busy = 0; // 忙碌标记 static u8 pt_sd_res = 0; // 测试结果 static char dev_name[6] = {0}; extern struct device *force_open_sd(char *sdx); int pt_sd_init(void) { if (force_open_sd("sd0")) { memcpy(dev_name, "sd0", strlen("sd0")); } else if (force_open_sd("sd1")) { memcpy(dev_name, "sd1", strlen("sd1")); } else { return PT_E_NO_DEV; } return 0; } int pt_sd_test_start(void) { FILE *fp = NULL; int err = 0; char mount_path[32] = "storage/"; char file_name[64] = {0}; if (!strlen(dev_name)) { err = PT_E_MOD_UNREADY; goto _end; } strcat(mount_path, dev_name); memcpy(file_name, mount_path, strlen(mount_path)); strcat(file_name, "/C"); //分区信息C\D\E\F strcat(file_name, "/abc.txt");//需要操作的文件 log_info("pt_sd_test >>>> mount_path: %s, test_file = %s", mount_path, file_name); void *mnt = mount(dev_name, mount_path, "fat", 3, NULL); if (mnt) { log_info("sd mount fat succ"); } else { log_error("sd mount fat failed"); err = PT_E_MOD_TEST_ERROR; goto _end; } u8 str[] = "This is a test string."; u8 buf[100]; u8 len; fp = fopen(file_name, "w+"); if (!fp) { log_error("open file ERR!"); err = PT_E_MOD_TEST_ERROR; goto _end; } len = fwrite(str, sizeof(str), 1, fp); if (len != sizeof(str)) { log_error("write file ERR!"); err = PT_E_MOD_TEST_ERROR; goto _end; } #if 1 fseek(fp, 0, SEEK_SET); len = fread(buf, sizeof(str), 1, fp); if (len != sizeof(str)) { log_error("read file ERR!"); err = PT_E_MOD_TEST_ERROR; goto _end; } put_buf(buf, sizeof(str)); #endif log_info("SD ok!"); _end: if (fp) { fdelete(fp); fp = NULL; } pt_sd_res = err; return err; } int pt_sd_start(void) { if (pt_sd_busy) { return PT_E_MOD_RUN; } pt_sd_res = PT_E_MOD_RUN; int msg[3] = {0}; msg[0] = (int)pt_sd_test_start; msg[1] = 1; msg[2] = (int)0; do { int os_err = os_taskq_post_type("app_core", Q_CALLBACK, 3, msg); if (os_err == OS_ERR_NONE) { break; } if (os_err != OS_Q_FULL) { pt_sd_res = PT_E_SYS_ERROR; return PT_E_SYS_ERROR; } os_time_dly(1); } while (1); pt_sd_busy = 1; return 0; } int pt_sd_stop(void) { if (pt_sd_res == PT_E_MOD_RUN) { pt_sd_res = PT_E_MOD_STOP_NO_END; } return 0; } int pt_sd_ioctrl(u32 order, int len, void *param) { u32 result = 0; switch (PT_ORDER_C_GET(order)) { case PT_N_C_START: result = pt_sd_start(); break; case PT_N_C_STOP: result = pt_sd_stop(); break; case PT_N_C_GET_RESULT: result = pt_sd_res; break; default: result = PT_E_PARAM; break; } product_test_push_data(order, 4, (u8 *)&result); return result; } REGISTER_PT_MODULE(sd) = { .module = PT_M_SD, .attr = PT_ATTR_SELF, .init = pt_sd_init, .ioctrl = pt_sd_ioctrl, }; void pt_sd_test(void) { pt_sd_init(); pt_sd_start(); } int pt_sd_simulation_test() { int ret = pt_sd_init(); ASSERT(!ret, "%s result:%d", __func__, ret); ret = pt_sd_test_start(); ASSERT(!ret, "%s result:%d", __func__, ret); return ret; } #endif /* #if PT_SD_ENABLE */