regression: test serial port r/w.
authorMinep <lunaixsky@qq.com>
Tue, 5 Sep 2023 23:50:17 +0000 (00:50 +0100)
committerMinep <lunaixsky@qq.com>
Tue, 5 Sep 2023 23:51:17 +0000 (00:51 +0100)
fix: uart register bitmap
fix: refine context switch trace message
feat: add a dedicated program to host all test routines

lunaix-os/hal/char/serial.c
lunaix-os/hal/char/uart/16550.h
lunaix-os/hal/char/uart/16550_base.c
lunaix-os/hal/char/uart/16550_pmio.c
lunaix-os/kernel/debug/trace.c
lunaix-os/makeinc/qemu.mkinc
lunaix-os/usr/makefile
lunaix-os/usr/testp/main.c [new file with mode: 0644]
lunaix-os/usr/testp/makefile [new file with mode: 0644]

index 2c4a272a39f216dd9942c021aac1cc0730ecb176..8997c57ed594871ff49f147c47ce1d1dab784400 100644 (file)
@@ -171,6 +171,8 @@ serial_create()
     sdev->dev = dev;
     dev->underlay = sdev;
 
+    waitq_init(&sdev->wq_rxdone);
+    waitq_init(&sdev->wq_txdone);
     fifo_init(&sdev->rxbuf, valloc(RXBUF_SIZE), RXBUF_SIZE, 0);
     llist_append(&serial_devs, &sdev->sdev_list);
     // llist_init_head(&sdev->cmds);
index a6565752eca4e8bb3e2c251875e5c13e4c9ab4b2..1b903a735374776c8ab468ff31388a0408bdd3fc 100644 (file)
 #define UART_rLS_BI (1 << 4)
 
 #define UART_rII_FIFOEN (0b11 << 6)
-#define UART_rII_ID 0b1110
+#define UART_rII_ID 0b1111
 
 #define UART_rFC_EN 1
+#define UART_rFC_DMA1 (1 << 3)
 #define UART_rFC_XMIT_RESET (1 << 2)
 #define UART_rFC_RCVR_RESET (1 << 1)
 
@@ -80,14 +81,14 @@ uart_setup(struct uart16550* uart)
 }
 
 static inline void
-uart_setie(struct uart16550* uart)
+uart_clrie(struct uart16550* uart)
 {
     uart->cntl_save.rie = uart->read_reg(uart, UART_rIE);
     uart->write_reg(uart, UART_rIE, 0);
 }
 
 static inline void
-uart_clrie(struct uart16550* uart)
+uart_setie(struct uart16550* uart)
 {
     uart->write_reg(uart, UART_rIE, uart->cntl_save.rie | 1);
 }
@@ -155,7 +156,8 @@ uart_eorcv(struct uart16550* uart)
 static inline int
 uart_enable_fifo(struct uart16550* uart, int trig_lvl)
 {
-    uart->cntl_save.rfc = UART_rFC_EN | (trig_lvl & 0b11);
+    uart->cntl_save.rfc =
+      UART_rFC_EN | ((trig_lvl & 0b11) << 6) | UART_rFC_DMA1;
     uart->write_reg(uart, UART_rFC, uart->cntl_save.rfc);
 
     return uart->read_reg(uart, UART_rII) & UART_rII_FIFOEN;
@@ -184,7 +186,7 @@ static inline int
 uart_intr_identify(struct uart16550* uart)
 {
     u32_t rii = uart->read_reg(uart, UART_rII);
-    return (!!(rii & UART_rII_FIFOEN) << 3) | ((rii & UART_rII_ID) >> 1);
+    return (rii & UART_rII_ID);
 }
 
 static inline u8_t
index 4ae45d78e1cfbf50ffb760ab0215b1f3bacc6450..e3dda36e48823b7d704dfe2b8e16f4c9da3137fb 100644 (file)
@@ -66,15 +66,14 @@ uart_general_irq_handler(int iv, struct llist_header* ports)
     llist_for_each(pos, n, ports, local_ports)
     {
         int is = uart_intr_identify(pos);
-        if (iv == pos->iv && is == UART_DATA_OK) {
-            break;
+        if (iv == pos->iv && (is == UART_DATA_OK || is == UART_CHR_TIMEOUT)) {
+            goto done;
         }
     }
 
-    if (!pos) {
-        return;
-    }
+    return;
 
+done:
     char recv;
     int i = 0;
     while ((recv = uart_read_byte(pos))) {
index 4342d98b33202c0352dd514e56413c19ea69af2f..1415174f432c96593f554344dc60a7df3a8ca68d 100644 (file)
@@ -74,7 +74,6 @@ upiom_init(struct device_def* def)
             *((volatile int*)irqs[i]) = 0;
         }
 
-        uart_setup(uart);
         uart_enable_fifo(uart, UART_FIFO8);
         llist_append(&com_ports, &uart->local_ports);
 
@@ -85,6 +84,8 @@ upiom_init(struct device_def* def)
 
         uart->sdev = sdev;
 
+        uart_setup(uart);
+        uart_setie(uart);
         uart = NULL;
     }
 
index 3d712c04db4d97531d5af52064500709e90b71cd..0cee498f3cb6d4f26fe1bcd0ceb1aa907e894ac7 100644 (file)
@@ -145,7 +145,7 @@ trace_printstack_isr(const isr_param* isrm)
 {
     isr_param* p = isrm;
     ptr_t fp = cpu_get_fp();
-    int prev_fromusr = uspace_context(p);
+    int prev_fromusr = 0;
 
     kprintf(KDEBUG "\n");
     kprintf(KDEBUG "stack trace (pid=%d)\n", __current->pid);
index 85fd982d892a2f710ae1d8debbca0c2048710c3d..12d21b8cbcb79b93a20ae80996a8a08ce055a432 100644 (file)
@@ -8,7 +8,7 @@ get_qemu_options = -s -S -m 1G \
                                -no-shutdown \
                                -d cpu_reset \
                                -d trace:ide_dma_cb \
-                               -serial tcp::12345,server,nowait\
+                               -serial telnet::12345,server,nowait\
                                -drive id=disk,file="machine/disk0.vdi",if=none \
                                -drive id=cdrom,file="$(1)",readonly=on,if=none,format=raw \
                                -device ahci,id=ahci \
index fa9c1c1f3ff20db324ef6334c25a5316d67cb043..d0374d6d97dbd8c6bdb9eb02d96796ceb3cac4bc 100644 (file)
@@ -33,6 +33,7 @@ app-list += init
 app-list += signal_demo
 app-list += sh
 app-list += cat
+app-list += testp
 
 mkapp-list := $(addprefix app-, $(app-list))
 
diff --git a/lunaix-os/usr/testp/main.c b/lunaix-os/usr/testp/main.c
new file mode 100644 (file)
index 0000000..8011c30
--- /dev/null
@@ -0,0 +1,50 @@
+#include <errno.h>
+#include <fcntl.h>
+#include <lunaix/lunaix.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+void
+test_serial()
+{
+    int fd = open("/dev/ttyS0", FO_WRONLY);
+    if (fd < 0) {
+        printf("ttyS0 not accessable (%d)\n", errno);
+        return;
+    }
+
+    char buf[32];
+    int sz = 0;
+
+    printf("ttyS0 input: ");
+
+    if ((sz = read(fd, buf, 31)) < 0) {
+        printf("write to ttyS0 failed (%d)\n", errno);
+    }
+
+    buf[sz] = 0;
+
+    printf("%s", buf);
+
+    close(fd);
+}
+
+int
+main(int argc, char* argv[])
+{
+    if (argc <= 1) {
+        return 1;
+    }
+
+    char* target = argv[1];
+
+    if (!strcmp(target, "serial")) {
+        test_serial();
+    } else {
+        printf("unknown test: %s\n", target);
+        return 1;
+    }
+
+    return 0;
+}
\ No newline at end of file
diff --git a/lunaix-os/usr/testp/makefile b/lunaix-os/usr/testp/makefile
new file mode 100644 (file)
index 0000000..33802bd
--- /dev/null
@@ -0,0 +1,21 @@
+define src_files
+       main.c
+endef
+
+obj_files := $(addsuffix .o,$(src_files))
+include_opt := $(addprefix -I,$(INCLUDES))
+
+out := $(BUILD_DIR)/bin
+
+%.c.o: %.c
+       $(call status_,CC,$<)
+       @$(CC) $(CFLAGS) $(include_opt) -c $< -o $@
+
+$(out)/$(BUILD_NAME): $(obj_files)
+       $(call status_,LD,$(@F))
+       @$(CC) -T $(LD_SCRIPT) -o $@ $< $(LIBC) $(LDFLAGS)
+
+all: $(out)/$(BUILD_NAME)
+
+clean:
+       @rm -f $(obj_files)
\ No newline at end of file