From 5e8ac5e02a09140e97d56a9d5313504dfa31282d Mon Sep 17 00:00:00 2001 From: Leo C Date: Mon, 3 Sep 2018 12:03:37 +0200 Subject: [PATCH] cmd_attach.c, cmd_boot.c, cmd_loadcpm3.c: use cmd_error() --- avr/cmd_attach.c | 37 ++------------ avr/cmd_boot.c | 62 +++++++++-------------- avr/cmd_date.c | 4 +- avr/cmd_fat.c | 3 +- avr/cmd_loadcpm3.c | 119 +++++++++++++++++++++++--------------------- avr/cmd_sd.c | 1 - avr/command_tbl.c | 2 +- avr/strerror.c | 13 ++++- avr/z180-serv.c | 16 +++--- include/common.h | 11 ++-- include/config.h | 1 + include/errnum.h | 15 +++++- include/z180-serv.h | 12 ----- 13 files changed, 131 insertions(+), 165 deletions(-) diff --git a/avr/cmd_attach.c b/avr/cmd_attach.c index fcc4f49..0949687 100644 --- a/avr/cmd_attach.c +++ b/avr/cmd_attach.c @@ -15,34 +15,6 @@ #include "getopt-min.h" -static const FLASH char * const FLASH rc_messages[] = { - FSTR("OK"), - FSTR("Unknown error"), - FSTR("Disk number out of range 0..7"), - FSTR("Disk allready attached"), - FSTR("Disk not attached"), - FSTR("File not found"), - FSTR("Not enough memory"), - FSTR("Error opening file"), - FSTR("File allready attached to other drive"), - }; - -static -void printerror(int rc, uint8_t unit, char *fn) -{ - if (rc < 0 || (unsigned) rc >= ARRAY_SIZE(rc_messages)) - rc = 1; - -#if GCC_BUG_61443 - printf_P(PSTR("Attachment of '%s' to dsk%d failed: "), fn, unit); - my_puts_P(rc_messages[rc]); - my_puts_P(PSTR("!\n")); -#else - printf_P(PSTR("Attachment of '%s' to dsk%d failed: %S!\n"), - fn, unit, rc_messages[rc]); -#endif -} - /* * attach [[options] [unit [diskfile]]] * @@ -58,7 +30,7 @@ void printerror(int rc, uint8_t unit, char *fn) command_ret_t do_attach(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { - uint8_t unit; + uint8_t unit = 0; char *filename = NULL; bool detach = false; bool detach_all = false; @@ -134,8 +106,7 @@ command_ret_t do_attach(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * co strncmp_P(argv[optind], PSTR("dsk"), 3) || (unit = argv[optind][3] - '0') >= CONFIG_CPM_MAX_DRIVE)) { - printf_P(PSTR("Unknown device: '%s'\n"), argv[optind]); - return CMD_RET_FAILURE; + cmd_error(CMD_RET_FAILURE, 0, PSTR("Invalid device: '%s'"), argv[optind]); } if (detach) { @@ -152,7 +123,7 @@ command_ret_t do_attach(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * co res = drv_attach(unit, filename, options); if (res) - printerror(res, unit, filename); + cmd_error(CMD_RET_FAILURE, res, PSTR("Attachment of '%s' to dsk%d failed"), filename, unit); - return res ? CMD_RET_FAILURE : CMD_RET_SUCCESS; + return CMD_RET_SUCCESS; } diff --git a/avr/cmd_boot.c b/avr/cmd_boot.c index b4aa5c0..a1afe77 100644 --- a/avr/cmd_boot.c +++ b/avr/cmd_boot.c @@ -58,18 +58,18 @@ static void z80_load_mem(int_fast8_t verbosity, } } -command_ret_t do_loadf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_loadf(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - (void) cmdtp; (void) flag; (void) argc; (void) argv; + ERRNUM res = ESUCCESS; if (z80_bus_state() & ZST_RUNNING) { - my_puts_P(PSTR("Can't load while CPU is running!\n")); - return CMD_RET_FAILURE; - } - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; + res = ERUNNING; + } else if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { + res = EBUSTO; } + if (res != ESUCCESS) + cmd_error(CMD_RET_FAILURE, res, NULL); + z80_load_mem(2, hdrom, &hdrom_sections, hdrom_address, @@ -111,7 +111,7 @@ void print_vars(char *title) * -v verbose */ -command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_bootcf(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { struct { uint8_t jr[2]; @@ -134,8 +134,7 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * co int_fast8_t verbosity = 0; uint8_t default_stages; uint32_t val; - - (void) cmdtp; (void) flag; + ERRNUM res = ESUCCESS; /* get default values */ memcpy_P(&boot_param, cfboot, sizeof boot_param); @@ -211,16 +210,14 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * co return CMD_RET_FAILURE; } - - if (z80_bus_state() & ZST_RUNNING) { - my_puts_P(PSTR("CPU is allready running!\n")); - return CMD_RET_FAILURE; - } - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return CMD_RET_FAILURE; + res = ERUNNING; + } else if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { + res = EBUSTO; } + if (res != ESUCCESS) + cmd_error(CMD_RET_FAILURE, res, NULL); + z80_load_mem(verbosity, cfboot, &cfboot_sections, cfboot_address, @@ -273,12 +270,10 @@ command_ret_t do_bootcf(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * co return CMD_RET_SUCCESS; } -command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint16_t count=1; - (void) cmdtp; (void) flag; - if (!(z80_bus_state() & ZST_RUNNING)) { printf_P(PSTR("## CPU is not running!\n")); return CMD_RET_FAILURE; @@ -295,12 +290,10 @@ command_ret_t do_busreq_pulse(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, cha } -command_ret_t do_go(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_go(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint32_t addr; - (void) cmdtp; (void) flag; - if (argc < 2) return CMD_RET_USAGE; addr = eval_arg(argv[1], NULL); @@ -312,7 +305,7 @@ command_ret_t do_go(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const } if (z80_bus_state() & ZST_RUNNING) { - printf_P(PSTR("## CPU allready running!\n")); + printf_P(PSTR("## CPU already running!\n")); return CMD_RET_FAILURE; } @@ -347,20 +340,16 @@ void reset_cpu(bus_cmd_t mode) } -command_ret_t do_reset(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_reset(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - (void) cmdtp; (void) flag; (void) argc; (void) argv; - printf_P(PSTR("CPU now in reset state.\n")); reset_cpu(Reset); return CMD_RET_SUCCESS; } -command_ret_t do_restart(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_restart(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { - (void) cmdtp; (void) flag; (void) argc; (void) argv; - reset_cpu(Restart); return CMD_RET_SUCCESS; @@ -382,17 +371,14 @@ void print_con_usage(char esc) ), esc + 0x40); } -command_ret_t do_console(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_console(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc UNUSED, char * const argv[] UNUSED) { int ch; uint8_t pending; -// uint8_t help_prompt = 0; uint8_t code = 0; uint8_t state = 0; char esc_char = (char) getenv_ulong(PSTR(ENV_ESC_CHAR), 16, CONFIG_ESC_CHAR); - (void) cmdtp; (void) flag; (void) argc; (void) argv; - printf_P(PSTR("Connecting to CPU. Escape character is '^%c'.\n"), esc_char + 0x40); @@ -419,7 +405,7 @@ command_ret_t do_console(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * c } break; case 2: - printf_P(PSTR("\n" + my_puts_P(PSTR("\n" "------------------------------------------------\n")); case 1: state = 0; @@ -437,7 +423,7 @@ command_ret_t do_console(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * c case 'X': case 'Q': - printf_P(PSTR("\n")); + putchar('\n'); goto quit; break; diff --git a/avr/cmd_date.c b/avr/cmd_date.c index cbc4a32..0bd3ebb 100644 --- a/avr/cmd_date.c +++ b/avr/cmd_date.c @@ -123,15 +123,13 @@ int mk_date (const char *datestr, struct tm *tmp) return (-1); } -command_ret_t do_date(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_date(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { struct tm t; char buf[30]; int rc; command_ret_t rcode = CMD_RET_FAILURE; - (void) cmdtp; (void) flag; - switch (argc) { case 2: /* set date & time */ /* initialize t with current time */ diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 77505b4..2970ac3 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -20,7 +20,6 @@ #include "timer.h" #include "debug.h" #include "env.h" -#include "errnum.h" #define DEBUG_FA 0 /* set to 1 to debug */ @@ -582,7 +581,7 @@ command_ret_t do_rw(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, if (res) cmd_error(CMD_RET_FAILURE, res, PSTR("'%s'"), argv[1]); - if (buserr || res) + if (buserr) cmd_error(CMD_RET_FAILURE, EBUSTO, NULL); return CMD_RET_SUCCESS; diff --git a/avr/cmd_loadcpm3.c b/avr/cmd_loadcpm3.c index 6ccb3f9..ee336da 100644 --- a/avr/cmd_loadcpm3.c +++ b/avr/cmd_loadcpm3.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2015,2016 Leo C. + * (C) Copyright 2015,2016,2018 Leo C. * * SPDX-License-Identifier: GPL-2.0 */ @@ -17,12 +17,23 @@ #include "con-utils.h" #include "z80-if.h" #include "debug.h" +#include "errnum.h" #define RS 128 /* CP/M record size */ #define FSIZE_t DWORD +static FRESULT read_record(FIL *fp, uint8_t *buffer) +{ + unsigned int br; /* bytes read */ + + FRESULT res = f_read(fp, buffer, RS, &br); + if (br != RS) + return EEOF; + return res; +} + /* * Load Routine * @@ -30,37 +41,32 @@ * len = Length in pages of module to read * */ -int load(FIL *File, uint32_t addr, uint8_t len) +ERRNUM load(FIL *File, uint32_t addr, uint8_t len) { uint8_t buffer[RS]; - unsigned int br; /* bytes read */ - int res; len *= 2; /* length in records of module */ //debug("## load: addr: 0x%.4X, records: 0x%.4X, (%u)\n", addr, len, len); for (; len; len--) { addr -= RS; - res = f_read(File, buffer, RS, &br); - if (res || br != RS) { - return 1; - } + FRESULT res = read_record(File, buffer); + if (res) + return res; - if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) { - my_puts_P(PSTR("Bus timeout\n")); - return 2; - } + if (!(z80_bus_cmd(Request) & ZST_ACQUIRED)) + return EBUSTO; z80_write_block(buffer, addr, RS); z80_bus_cmd(Release); //debug("## written: 0x%.4X\n", addr); } - return 0; + return ESUCCESS; } #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" -command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { uint16_t mem_top; uint8_t res_len; @@ -72,11 +78,8 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * char *fname; FIL File; char default_fname[strlen_P(PSTR(CONFIG_CPM3_SYSFILE)) + 1]; - unsigned int br; /* bytes read */ uint8_t buffer[RS]; - int res; - - (void) cmdtp; (void) flag; + FRESULT res; //common_base = getenv_ulong(PSTR(ENV_CPM3_COMMON_BASE), 16, @@ -99,16 +102,14 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * } res = f_open(&File, fname, FA_READ ); - if (res) { - printf_P(PSTR("Error: failed to open '%s'\n"), fname); - return CMD_RET_FAILURE; - } + if (res) + goto out; printf_P(PSTR("Loading: '%s'...\n"), fname); /* read the load record */ - res = f_read(&File, buffer, RS, &br); - if (res || br != RS) + res = read_record(&File, buffer); + if (res) goto out; mem_top = buffer[0] << 8; @@ -118,8 +119,8 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * osentry_addr = buffer[4] + (buffer[5] << 8); /* read display info */ - res = f_read(&File, buffer, RS, &br); - if (res || br != RS) + res = read_record(&File, buffer); + if (res) goto out; /* print the info */ @@ -134,11 +135,15 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * */ FSIZE_t common_base_ofs = ((res_len - 6) << 8) + 2*RS + RS-7; FSIZE_t cur_pos = f_tell(&File); + unsigned int br; /* bytes read */ if ((res = f_lseek(&File, common_base_ofs)) || (res = f_read(&File, buffer, 2, &br)) || - (br != 2) || (res = f_lseek(&File, cur_pos))) goto out; + if (br != 2) { + res = EEOF; + goto out; + } common_base = (uint16_t) buffer[0] + (buffer[1] << 8); setenv_hex(PSTR(ENV_CPM3_COMMON_BASE), common_base); } @@ -157,38 +162,36 @@ command_ret_t do_loadcpm3(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * out: f_close(&File); - if (res) { - printf_P(PSTR("Error: failed to read '%s'\n"), fname); - return CMD_RET_FAILURE; - } else { - if (res_len != 0) { - if (osentry_addr + common_base > 0xffff) { - z80_bus_cmd(Request); - if (z80_read(osentry_addr + common_base) == 0xc3) { - osentry_addr = z80_read(osentry_addr+common_base+1) + - (z80_read(osentry_addr + common_base+2) << 8); - } - z80_bus_cmd(Release); - if (banked_base + osentry_addr > 0xffff) - osentry_addr = 0; + if (res) + cmd_error(CMD_RET_FAILURE, res, PSTR("%s"), fname); + + if (res_len != 0) { + if (osentry_addr + common_base > 0xffff) { + z80_bus_cmd(Request); + if (z80_read(osentry_addr + common_base) == 0xc3) { + osentry_addr = z80_read(osentry_addr+common_base+1) + + (z80_read(osentry_addr + common_base+2) << 8); } - setenv_hex(PSTR(ENV_STARTADDRESS), osentry_addr); + z80_bus_cmd(Release); + if (banked_base + osentry_addr > 0xffff) + osentry_addr = 0; } - printf_P(PSTR("Loaded: Resident: ")); - if (res_len != 0) - printf_P(PSTR("0x%.5lX-0x%.5lX, "), - (common_base + mem_top) - res_len*256, - (common_base + mem_top) - 1); - else - printf_P(PSTR(" - ")); - printf_P(PSTR("Banked: ")); - if (bank_len != 0) - printf_P(PSTR("0x%.5lX-0x%.5lX\n"), - (banked_base + bank_top) - bank_len*256, - (banked_base + bank_top) - 1); - else - printf_P(PSTR(" - \n")); - - return CMD_RET_SUCCESS; + setenv_hex(PSTR(ENV_STARTADDRESS), osentry_addr); } + printf_P(PSTR("Loaded: Resident: ")); + if (res_len != 0) + printf_P(PSTR("%.5lX-%.5lX, "), + (common_base + mem_top) - res_len*256, + (common_base + mem_top) - 1); + else + printf_P(PSTR(" - ")); + printf_P(PSTR("Banked: ")); + if (bank_len != 0) + printf_P(PSTR("%.5lX-%.5lX\n"), + (banked_base + bank_top) - bank_len*256, + (banked_base + bank_top) - 1); + else + printf_P(PSTR(" - \n")); + + return CMD_RET_SUCCESS; } diff --git a/avr/cmd_sd.c b/avr/cmd_sd.c index b192215..7484855 100644 --- a/avr/cmd_sd.c +++ b/avr/cmd_sd.c @@ -11,7 +11,6 @@ #include "eval_arg.h" #include "print-utils.h" #include "z80-if.h" -#include "errnum.h" /* diff --git a/avr/command_tbl.c b/avr/command_tbl.c index d93294b..232d718 100644 --- a/avr/command_tbl.c +++ b/avr/command_tbl.c @@ -328,7 +328,7 @@ CMD_TBL_ITEM( attach, CONFIG_SYS_MAXARGS, CTBL_RPT, do_attach, "attach filesystem image file to CP/M drive", "[-rw] [-o options] dsk diskfile\n" - " Attach diskfile to dsk, where n in 0..7\n" + " Attach diskfile to dsk, where n in 0.."CONFIG_CPM_MAX_DRNR_STR"\n" " -r File is read only (write protected)\n" " -w File is read/write (default)\n" " -o options\n" diff --git a/avr/strerror.c b/avr/strerror.c index bb151ad..4fdc63d 100644 --- a/avr/strerror.c +++ b/avr/strerror.c @@ -5,14 +5,23 @@ */ #include "common.h" -#include "errnum.h" #include "cmd_fat.h" static const FLASH char * const FLASH error_strings[] = { FSTR("Unknown error"), FSTR("Not enough memory"), - FSTR("Bus timeout") + FSTR("Bus timeout"), + FSTR("Unexpected argument"), + FSTR("Invalid disk number"), + FSTR("Disk already attached"), + FSTR("Disk not attached"), + FSTR("Error opening file"), + FSTR("File already attached to other drive"), + FSTR("CPU is running"), + FSTR("Invalid argument"), + FSTR("Unexpected EOF"), + }; const FLASH char * my_strerror_P(ERRNUM errnum) diff --git a/avr/z180-serv.c b/avr/z180-serv.c index ac57645..cdc6e5e 100644 --- a/avr/z180-serv.c +++ b/avr/z180-serv.c @@ -292,17 +292,17 @@ int drv_attach(uint8_t unit, const char *filename, drv_opt_t options) drv = unit; if (drv >= CONFIG_CPM_MAX_DRIVE) - return AT_RANGE; + return EATRANGE; struct cpm_drive_s *p = &drv_table[drv]; if (options & DRV_OPT_REATTATCH) { if (filename) { - return AT_ERROR; + return EUNEXPARG; } if (!p->img_name) { - return AT_NOT; + return EATNOT; } /* change options */ @@ -317,16 +317,16 @@ int drv_attach(uint8_t unit, const char *filename, drv_opt_t options) } else { if (p->img_name) - return AT_ALREADY; + return EATALRDY; if (drv_find_file_attached(filename) >= 0) - return AT_OTHER; + return EATOTHER; p->opt = options; /* new attachment */ if ((p->img_name = strdup(filename)) == NULL) - return AT_NOMEM; + return ENOMEM; res = f_open(&p->fd, p->img_name, FA_READ | (options&DRV_OPT_RO ? 0 : FA_WRITE)); @@ -355,11 +355,11 @@ int drv_attach(uint8_t unit, const char *filename, drv_opt_t options) } if (res) { drv_detach(drv); - return AT_OPEN; + return EATOPEN; } } - return AT_OK; + return ESUCCESS; } diff --git a/include/common.h b/include/common.h index eb38853..12d87c4 100644 --- a/include/common.h +++ b/include/common.h @@ -12,6 +12,7 @@ #include #include #include +#include "errnum.h" #define GCC_VERSION (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) @@ -82,18 +83,18 @@ extern volatile uint_least8_t Stat; #define S_CON_PENDING (1<<2) static inline -void my_puts(const char *s) +int my_puts(const char *s) { - fputs(s, stdout); + return fputs(s, stdout); } static inline -void my_puts_P(const char *s) +int my_puts_P(const char *s) { #ifdef __AVR__ - fputs_P(s, stdout); + return fputs_P(s, stdout); #else - fputs(s, stdout); + return fputs(s, stdout); #endif /* __AVR__ */ } diff --git a/include/config.h b/include/config.h index d989772..6640e67 100644 --- a/include/config.h +++ b/include/config.h @@ -44,6 +44,7 @@ #define CONFIG_CPM3_BANKED_BASE_STR "0" #define CONFIG_CPM_MAX_DRIVE 8 +#define CONFIG_CPM_MAX_DRNR_STR "7" #define CONFIG_CPM_BASE_DRIVE 'A' #define CONFIG_CPM_BLOCK_SIZE 512 diff --git a/include/errnum.h b/include/errnum.h index 5de8f2b..adb8a80 100644 --- a/include/errnum.h +++ b/include/errnum.h @@ -10,8 +10,19 @@ #include "errnum.h" typedef enum { - ENOMEM = 101, - EBUSTO + ESUCCESS = 0, + ENOMEM = 101, + EBUSTO, + EUNEXPARG, + EATRANGE, + EATALRDY, + EATNOT, + EATOPEN, + EATOTHER, + ERUNNING, + EINVAL, + EEOF, + } ERRNUM; #endif /* ERRNUM_H */ diff --git a/include/z180-serv.h b/include/z180-serv.h index 3b4a462..760fa04 100644 --- a/include/z180-serv.h +++ b/include/z180-serv.h @@ -38,18 +38,6 @@ struct cpm_drive_s { FIL fd; }; -/* Return codes */ - -#define AT_OK 0 -#define AT_ERROR 1 -#define AT_RANGE 2 -#define AT_ALREADY 3 -#define AT_NOT 4 -#define AT_NOFILE 5 -#define AT_NOMEM 6 -#define AT_OPEN 7 -#define AT_OTHER 8 - int drv_list(void); int drv_detach(uint8_t drv); -- 2.39.2