From: Minep Date: Tue, 5 Sep 2023 23:50:17 +0000 (+0100) Subject: regression: test serial port r/w. X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/commitdiff_plain/8efc0cf32160c68772a2ce1887e6a397852d3d96 regression: test serial port r/w. fix: uart register bitmap fix: refine context switch trace message feat: add a dedicated program to host all test routines --- diff --git a/lunaix-os/hal/char/serial.c b/lunaix-os/hal/char/serial.c index 2c4a272..8997c57 100644 --- a/lunaix-os/hal/char/serial.c +++ b/lunaix-os/hal/char/serial.c @@ -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); diff --git a/lunaix-os/hal/char/uart/16550.h b/lunaix-os/hal/char/uart/16550.h index a656575..1b903a7 100644 --- a/lunaix-os/hal/char/uart/16550.h +++ b/lunaix-os/hal/char/uart/16550.h @@ -30,9 +30,10 @@ #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 diff --git a/lunaix-os/hal/char/uart/16550_base.c b/lunaix-os/hal/char/uart/16550_base.c index 4ae45d7..e3dda36 100644 --- a/lunaix-os/hal/char/uart/16550_base.c +++ b/lunaix-os/hal/char/uart/16550_base.c @@ -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))) { diff --git a/lunaix-os/hal/char/uart/16550_pmio.c b/lunaix-os/hal/char/uart/16550_pmio.c index 4342d98..1415174 100644 --- a/lunaix-os/hal/char/uart/16550_pmio.c +++ b/lunaix-os/hal/char/uart/16550_pmio.c @@ -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; } diff --git a/lunaix-os/kernel/debug/trace.c b/lunaix-os/kernel/debug/trace.c index 3d712c0..0cee498 100644 --- a/lunaix-os/kernel/debug/trace.c +++ b/lunaix-os/kernel/debug/trace.c @@ -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); diff --git a/lunaix-os/makeinc/qemu.mkinc b/lunaix-os/makeinc/qemu.mkinc index 85fd982..12d21b8 100644 --- a/lunaix-os/makeinc/qemu.mkinc +++ b/lunaix-os/makeinc/qemu.mkinc @@ -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 \ diff --git a/lunaix-os/usr/makefile b/lunaix-os/usr/makefile index fa9c1c1..d0374d6 100644 --- a/lunaix-os/usr/makefile +++ b/lunaix-os/usr/makefile @@ -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 index 0000000..8011c30 --- /dev/null +++ b/lunaix-os/usr/testp/main.c @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include +#include + +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 index 0000000..33802bd --- /dev/null +++ b/lunaix-os/usr/testp/makefile @@ -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