X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/414caa77d5709bf3372d1f9245312781eee7961b..dd1cc6f0b4a9cc2b49afb86c768813c087e46b4b:/avr/cmd_fat.c diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 7cc9e46..2970ac3 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -21,7 +21,6 @@ #include "debug.h" #include "env.h" - #define DEBUG_FA 0 /* set to 1 to debug */ #define debug_fa(fmt, args...) \ @@ -98,41 +97,6 @@ static const FLASH char * const FLASH rc_strings[] = { FSTR("Invalid parameter") }; -static const FLASH char * const FLASH rc_names[] = { - FSTR("OK"), - FSTR("DISK_ERR"), - FSTR("INT_ERR"), - FSTR("NOT_READY"), - FSTR("NO_FILE"), - FSTR("NO_PATH"), - FSTR("INVALID_NAME"), - FSTR("DENIED"), - FSTR("EXIST"), - FSTR("INVALID_OBJECT"), - FSTR("WRITE_PROTECTED"), - FSTR("INVALID_DRIVE"), - FSTR("NOT_ENABLED"), - FSTR("NO_FILE_SYSTEM"), - FSTR("MKFS_ABORTED"), - FSTR("TIMEOUT"), - FSTR("LOCKED"), - FSTR("NOT_ENOUGH_CORE"), - FSTR("TOO_MANY_OPEN_FILES"), - FSTR("INVALID_PARAMETER") - }; - -static -void put_rc (FRESULT rc) -{ -#if GCC_BUG_61443 - printf_P(PSTR("rc=%u FR_"), rc); - my_puts_P(rc < ARRAY_SIZE(rc_names) ? rc_names[rc] : PSTR(" Unknown Error")); - my_puts_P(PSTR("\n")); -#else - printf_P(PSTR("rc=%u FR_%S\n"), rc, - rc < ARRAY_SIZE(rc_names) ? rc_names[rc] : PSTR(" Unknown Error")); -#endif -} const FLASH char * fat_rctostr(FRESULT rc) @@ -204,7 +168,7 @@ static PATH_T *path_setup(char *string) PATH_T *p = (PATH_T *) malloc(sizeof *p); if (p == NULL) { - cmd_error(0, 0, PSTR("'%s': Out of Memory"), string); + cmd_error(0, ENOMEM, NULL); return NULL; } @@ -216,7 +180,7 @@ static PATH_T *path_setup(char *string) p->p_path[2] = '/'; len += 1; } else { - cmd_error(0, 0, PSTR("'%s': Out of Memory"), string); + cmd_error(0, ENOMEM, NULL); return NULL; } } @@ -241,10 +205,8 @@ command_ret_t do_pwd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc char *buf; buf = (char *) malloc(PATH_MAX); - if (buf == NULL) { - printf_P(PSTR("pwd: Out of Memory!\n")); - return CMD_RET_FAILURE; - } + if (buf == NULL) + cmd_error(CMD_RET_FAILURE, ENOMEM, NULL); *buf = '\0'; res = f_getcwd(buf, PATH_MAX); /* Get current directory path */ @@ -254,11 +216,9 @@ command_ret_t do_pwd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc puts(buf); } free(buf); - if (res != FR_OK) { + if (res != FR_OK) cmd_error(CMD_RET_FAILURE, res, NULL); - //put_rc(res); - //return CMD_RET_FAILURE; - } + return CMD_RET_SUCCESS; } @@ -275,8 +235,7 @@ command_ret_t do_cd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, if (argc < 2) { arg = getenv_str(PSTR(ENV_HOME)); if (arg == NULL) { - printf_P(PSTR("%s: \"%S\" is not set\n"), argv[0], PSTR(ENV_HOME)); - return CMD_RET_FAILURE; + cmd_error(CMD_RET_FAILURE, 0, PSTR("\"%S\" is not set"), PSTR(ENV_HOME)); } } else arg = argv[1]; @@ -294,10 +253,9 @@ command_ret_t do_cd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, debug_fa("### f_chdir(): p_path: '%s', res: %d\n", path->p_path, res); } free(path); - if (res != FR_OK) { - put_rc(res); - return CMD_RET_FAILURE; - } + if (res != FR_OK) + cmd_error(CMD_RET_FAILURE, res, NULL); + return CMD_RET_SUCCESS; } @@ -318,10 +276,8 @@ command_ret_t do_ls(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, buf = (char *) malloc(PATH_MAX); - if (buf == NULL) { - printf_P(PSTR("pwd: Out of Memory!\n")); - return CMD_RET_FAILURE; - } + if (buf == NULL) + cmd_error(CMD_RET_FAILURE, ENOMEM, NULL); if (argc < 2) res = f_getcwd(buf, PATH_MAX); /* Get current directory path */ @@ -332,8 +288,7 @@ command_ret_t do_ls(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, res = f_opendir(&Dir, buf); if (res != FR_OK) { free(buf); - put_rc(res); - return CMD_RET_FAILURE; + cmd_error(CMD_RET_FAILURE, res, NULL); } p1 = s1 = s2 = 0; @@ -366,10 +321,8 @@ command_ret_t do_ls(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, } free(buf); - if (res) { - put_rc(res); - return CMD_RET_FAILURE; - } + if (res) + cmd_error(CMD_RET_FAILURE, res, NULL); return CMD_RET_SUCCESS; } @@ -468,10 +421,8 @@ command_ret_t do_stat(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int arg struct stat_dat_s statp; buf = (char *) malloc(PATH_MAX); - if (buf == NULL) { - printf_P(PSTR("fat stat: Out of Memory!\n")); - return CMD_RET_FAILURE; - } + if (buf == NULL) + cmd_error(CMD_RET_FAILURE, ENOMEM, NULL); if (argc > 1) path = argv[1]; @@ -519,10 +470,9 @@ command_ret_t do_stat(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int arg } free(buf); - if (res) { - put_rc(res); - return CMD_RET_FAILURE; - } + if (res) + cmd_error(CMD_RET_FAILURE, res, NULL); + return CMD_RET_SUCCESS; } @@ -549,10 +499,9 @@ command_ret_t do_rw(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, return CMD_RET_USAGE; addr = eval_arg(argv[2], NULL); - if (addr >= MAX_MEMORY) { - printf_P(PSTR("address too high: 0x%0lx\n"), addr); - return CMD_RET_FAILURE; - } + if (addr >= MAX_MEMORY) + cmd_error(CMD_RET_FAILURE, 0, PSTR("Address too high: %#lx"), addr); + if (argc > 3) bytes = eval_arg(argv[3], NULL); else @@ -566,80 +515,74 @@ command_ret_t do_rw(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, bytes = MAX_MEMORY - addr; buffer = (uint8_t *) malloc(BUFFER_SIZE); - if (buffer == NULL) { - printf_P(PSTR("fatstat: Out of Memory!\n")); - return CMD_RET_FAILURE; - } + if (buffer == NULL) + cmd_error(CMD_RET_FAILURE, ENOMEM, NULL); - if (!res) { - res = f_open(&File, argv[1], dowrite ? FA_WRITE | FA_CREATE_ALWAYS - : FA_READ ); + res = f_open(&File, argv[1], dowrite ? FA_WRITE | FA_CREATE_ALWAYS + : FA_READ ); + if (!res) { + res = f_lseek(&File, pos); if (!res) { - res = f_lseek(&File, pos); - if (!res) { - bytes_rw = 0; - timer = get_timer(0); - while (bytes) { - unsigned int cnt, br; - - if (bytes >= BUFFER_SIZE) { - cnt = BUFFER_SIZE; - bytes -= BUFFER_SIZE; - } else { - cnt = bytes; bytes = 0; - } - if (dowrite) { - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - buserr = 1; - break; - } - z80_read_block(buffer, addr, cnt); - z80_bus_cmd(Release); - res = f_write(&File, buffer, cnt, &br); - if (res != FR_OK) - break; - } else { - res = f_read(&File, buffer, cnt, &br); - if (res != FR_OK) - break; - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - buserr = 1; - break; - } - z80_write_block(buffer, addr, br); - z80_bus_cmd(Release); - } - addr += br; - - bytes_rw += br; - if (cnt != br) { - if (dowrite) - printf_P(PSTR("Disk full?\n")); + bytes_rw = 0; + timer = get_timer(0); + while (bytes) { + unsigned int cnt, br; + + if (bytes >= BUFFER_SIZE) { + cnt = BUFFER_SIZE; + bytes -= BUFFER_SIZE; + } else { + cnt = bytes; bytes = 0; + } + if (dowrite) { + if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { + buserr = 1; break; } - if (check_abort()) + z80_read_block(buffer, addr, cnt); + z80_bus_cmd(Release); + res = f_write(&File, buffer, cnt, &br); + if (res != FR_OK) + break; + } else { + res = f_read(&File, buffer, cnt, &br); + if (res != FR_OK) break; + if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { + buserr = 1; + break; + } + z80_write_block(buffer, addr, br); + z80_bus_cmd(Release); } + addr += br; - FRESULT fr = f_close(&File); - if (!res) - res = fr; - timer = get_timer(timer); - printf_P(PSTR("%lu (0x%lx) bytes read/written with %lu bytes/sec.\n"), - bytes_rw, bytes_rw, timer ? (bytes_rw * 1000 / timer) : 0); + bytes_rw += br; + if (cnt != br) { + if (dowrite) + printf_P(PSTR("Disk full?\n")); + break; + } + if (check_abort()) + break; } + + FRESULT fr = f_close(&File); + if (!res) + res = fr; + timer = get_timer(timer); + printf_P(PSTR("%lu (%#lx) bytes read/written with %lu bytes/sec.\n"), + bytes_rw, bytes_rw, timer ? (bytes_rw * 1000 / timer) : 0); } } free(buffer); - if (buserr) - my_puts_P(PSTR("Bus timeout\n")); if (res) - put_rc(res); - if (buserr || res) - return CMD_RET_FAILURE; + cmd_error(CMD_RET_FAILURE, res, PSTR("'%s'"), argv[1]); + if (buserr) + cmd_error(CMD_RET_FAILURE, EBUSTO, NULL); return CMD_RET_SUCCESS; }