aboutsummaryrefslogtreecommitdiff
path: root/dos
diff options
context:
space:
mode:
authorJavier <dev.git@javispedro.com>2026-11-01 02:10:00 +0100
committerJavier <dev.git@javispedro.com>2026-11-01 02:10:00 +0100
commite4a6fae56db9aa7cd998da52536c9d1e37860098 (patch)
treed9fe6a5776a01a241f12711f3cbb600d84a2e00a /dos
parentf1c5b760e910918eca65a39958b1bac34c68bf34 (diff)
downloadchu-e4a6fae56db9aa7cd998da52536c9d1e37860098.tar.gz
chu-e4a6fae56db9aa7cd998da52536c9d1e37860098.zip
improve test program invocation, and add LUN commands
Diffstat (limited to 'dos')
-rw-r--r--dos/utest.c189
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;