Files
2025-12-03 11:12:34 +08:00

175 lines
3.7 KiB
C

#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 */