diff options
Diffstat (limited to 'dos')
| -rw-r--r-- | dos/utest.c | 189 |
1 files changed, 139 insertions, 50 deletions
diff --git a/dos/utest.c b/dos/utest.c index 7aa8750..cba251a 100644 --- a/dos/utest.c +++ b/dos/utest.c @@ -1,5 +1,6 @@ #include <stdlib.h> #include <stdio.h> +#include <string.h> #include <time.h> #include <dos.h> @@ -108,6 +109,30 @@ void chip_sleep() ch375_enter_sleep(&ch375_dev); } +void chip_version() +{ + printf("IC Version: 0x%hx\n", ch375_get_version(&ch375_dev)); +} + +void chip_reg(const char *arg_reg, const char *arg_value) +{ + int reg = arg_reg ? strtoul(arg_reg, NULL, 16) : -1; + int value = arg_value ? strtoul(arg_value, NULL, 16) : -1; + + if (reg >= 0) { + if (value >= 0) { + ch375_write_reg(&ch375_dev, reg, value); + printf("Reg[%x]=%x\n", reg, ch375_read_reg(&ch375_dev, reg)); + } else { + printf("Reg[%x]=%x\n", reg, ch375_read_reg(&ch375_dev, reg)); + } + } else { + for (reg = 0; reg < 0xFF; reg++) { + printf("Reg[%x]=%x\n", reg, ch375_read_reg(&ch375_dev, reg)); + } + } +} + void usb_host_off() { printf("Set usb mode disabled...\n"); @@ -251,13 +276,9 @@ int disk() int i = 0; if (ready) { - printf("Disk ready\n"); + printf("Disk already ready\n"); } else { - printf("Disk not ready\n"); - - if (!usb_host_connect()) { - return EXIT_FAILURE; - } + printf("Disk not ready, so trying to init\n"); if (!init_disk()) { return EXIT_FAILURE; @@ -328,6 +349,35 @@ int disk_read(uint32_t lba) return EXIT_SUCCESS; } +static void disk_reads(const char *arg) +{ + unsigned long lba = 0; + if (arg) { + lba = strtoul(arg, NULL, 10); + } + disk_read(lba); +} + +int disk_set_lun(int lun) +{ + uint8_t max_lun = ch375_read_reg(&ch375_dev, CH375_REG_DISK_MAX_LUN); + uint8_t cur_lun = ch375_read_reg(&ch375_dev, CH375_REG_DISK_LUN); + + printf("Disk max LUNs = %u , cur LUN = %u\n", max_lun, cur_lun); + + if (lun >= 0) { + ch375_write_reg(&ch375_dev, CH375_REG_DISK_LUN, lun); + printf("Set cur LUN to %u\n", lun); + } + + return EXIT_SUCCESS; +} + +void disk_set_luns(const char *luns) +{ + disk_set_lun(luns ? atoi(luns) : -1); +} + int autou() { uint8_t status; @@ -374,7 +424,7 @@ int autou() return EXIT_SUCCESS; } -int host() +int host_descr() { usb_device_descriptor *dev_descr; int n; @@ -437,63 +487,102 @@ int host() return EXIT_SUCCESS; } +typedef void (*cmd_func)(); +typedef void (*cmd_func1)(const char *arg1); +typedef void (*cmd_func2)(const char *arg1, const char *arg2); + +struct cmd { + const char *opt; + cmd_func func; + const char *arg1; + const char *arg2; +} cmds[] = { + {"disk", (cmd_func) disk}, + {"dread", (cmd_func)disk_reads, "[sector]"}, + {"dlun", (cmd_func)disk_set_luns, "[lun]"}, + {"dsize", (cmd_func)disk_size}, + {"dready", (cmd_func)disk_ready}, + + {"auto", (cmd_func)autou}, + {"host", (cmd_func)usb_host_on}, + {"hdescr", (cmd_func)host_descr}, + {"hconn", (cmd_func)usb_host_connect}, + {"hoff", (cmd_func)usb_host_off}, + {"hreset", (cmd_func)usb_host_reset}, + + {"reg", (cmd_func)chip_reg, "[reg]", "[value]"}, + + {"sleep", (cmd_func)chip_sleep}, + {"reset", (cmd_func)chip_reset}, + {"int", (cmd_func)dump_int_status}, + {"vers", (cmd_func)chip_version}, +}; + +#define NUM_COMMANDS (sizeof(cmds)/sizeof(struct cmd)) + +static void usage() +{ + int i, j; + printf("Usage: utest <cmd> <args>\n"); + printf("Supported commands: \n"); + for (i = 0; i < NUM_COMMANDS; i++) { + struct cmd *cmd = &cmds[i]; + printf(" %s", cmd->opt); + if (cmd->arg1) printf(" %s", cmd->arg1); + if (cmd->arg2) printf(" %s", cmd->arg2); + printf("\n"); + } + printf("To change IO port, set CH375_PORT env var\n"); +} + +static struct cmd * find_cmd(const char *arg) +{ + int i; + for (i = 0; i < NUM_COMMANDS; i++) { + struct cmd *cmd = &cmds[i]; + if (stricmp(cmd->opt, arg) == 0) { + return cmd; + } + } + return NULL; +} + int main(int argc, const char *argv[]) { - char mode = '?'; + const char *mode = argc > 1 ? argv[1] : 0; char *port = getenv("CH375_PORT"); + int rc; + struct cmd *cmd; if (port) { unsigned long lport = strtoul(port, NULL, 16); ch375_dev.io_base = lport; } - if (argc > 1) { - mode = argv[1][0]; + if (!mode || stricmp(mode, "help") == 0 || stricmp(mode, "?") == 0) { + usage(); + return EXIT_FAILURE; + } + + + cmd = find_cmd(mode); + if (!cmd) { + printf("Unrecognized command: %s\n", mode); + return EXIT_FAILURE; } - printf("Test mode %c using IO port 0x%x\n", mode, ch375_dev.io_base); + printf("\"%s\", using IO port 0x%x\n", cmd->opt, ch375_dev.io_base); dump_int_status(); - switch (mode) { - case 'd': - return disk(); - case 'e': - return disk_read(0); - case 'a': - return autou(); - case 'm': - return host(); - case 'h': - usb_host_on(); - break; - case 'c': - usb_host_connect(); - break; - case 'o': - usb_host_off(); - break; - case 'b': - usb_host_reset(); - break; - case 's': - chip_sleep(); - break; - case 'r': - chip_reset(); - break; - case 'i': - dump_int_status(); - break; - case 'v': - printf("IC Version: 0x%hx\n", ch375_get_version(&ch375_dev)); - break; - case '?': - printf("test modes: d e a m h c o b s r i v\n"); - break; - default: - printf("Unknown mode %c\n", mode); - return EXIT_FAILURE; + if (!cmd->arg1) { + cmd->func(); + } else if (cmd->arg1 && !cmd->arg2) { + cmd_func1 func = (cmd_func1) cmd->func; + func(argc > 2 ? argv[2] : 0); + } else if (cmd->arg1 && cmd->arg2) { + cmd_func2 func = (cmd_func2) cmd->func; + func(argc > 2 ? argv[2] : 0, argc > 3 ? argv[3] : 0); } return EXIT_SUCCESS; |
