From patchwork Wed Aug 12 07:35:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cixi Geng X-Patchwork-Id: 1343551 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=JO84XkBP; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BRM3s66cDz9sTF for ; Wed, 12 Aug 2020 17:37:26 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 3E5BD3C3100 for ; Wed, 12 Aug 2020 09:37:16 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it [217.194.8.4]) by picard.linux.it (Postfix) with ESMTP id 8AA4E3C25CA for ; Wed, 12 Aug 2020 09:37:14 +0200 (CEST) Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-4.smtp.seeweb.it (Postfix) with ESMTPS id B1C531000C32 for ; Wed, 12 Aug 2020 09:37:13 +0200 (CEST) Received: by mail-pj1-f66.google.com with SMTP id d4so678547pjx.5 for ; Wed, 12 Aug 2020 00:37:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=DcXvY4IQxm7NInfibGJJAAvekshGPxbussAgA7/WQ/0=; b=JO84XkBPvLsVheAaduop/5D9msdfT0Du0y+OYGpKYxVahiWcgJB8mxA7Y99RVYLsiB ASUaP5foFDwhw8Jae7bqibWgqDF68vqxmExKn8/3YsY9ulM96Cz+e4sS8U2DVzv4ELX2 vLswqX63U6IvGzK1Y6CHinzO41s0aQnKGvx+wDsR60C73HhNq7RMP7Lr7rsy6GtPQnaZ au+7g/O7rACz9BOhR5rwMTMqN8it0K315BPyTRsPJjX7eFLIlURGVyRWMLncg2MQx+um +pcyuE9ZcasWtfPpJFbes9sYAxqXLmz3NFbSrMdJjZ5m6RbQ1Mx0i2Est9DsFM3mVCef zttg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=DcXvY4IQxm7NInfibGJJAAvekshGPxbussAgA7/WQ/0=; b=ulhcEnYDvOfS4/joacuzRyJjRFI6xiVerGq5qg6Hp5uuQ2DHw71EIUfSW5qfpM2fum /cg0mFrOWME7IdvxyMFa9jC3gtCK8hczPiCZYD4Ai90ePqmBI4r+KipchpoSkaG8ynEQ iTm1R2/2l4DH68xERqmKQg+d0iYu6cSZ8gLWR8U0fwf3ICHZB9ZxklNwaBxzZX9mNvVg Mf3EgiOvnVQqn1HIhOI5ZxxRVFIPQgUQMj5dq/4VMEpkmhQyMEe4Hq1DZkDIuGNcfjOx XKfSHdOaCgoAwEEHkvwlskS36BGtkX1uGo/BgPE3yd3dEESnXzhiAH8zmtae/3+2i9qG EqVw== X-Gm-Message-State: AOAM530XAwEtuMeCxBKfgGOrvyQet8IP7GrxvvETQvMGdbZa9nZdRHNV mtzVVo5YQIg75JNagYBtsuk= X-Google-Smtp-Source: ABdhPJxeWnh0b9TgemwoaChevVkYw1uVWoOiSklIuK1BNqAwg+YSp3Qz7AZCFTzqaXRnMb76frWKaw== X-Received: by 2002:a17:902:59dd:: with SMTP id d29mr4205422plj.170.1597217772099; Wed, 12 Aug 2020 00:36:12 -0700 (PDT) Received: from bj616583pcu.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id g5sm1385069pfh.168.2020.08.12.00.36.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Aug 2020 00:36:11 -0700 (PDT) From: gengcixi@gmail.com To: chrubis@suse.cz, ceh@ti.com, ltp@lists.linux.it Date: Wed, 12 Aug 2020 15:35:28 +0800 Message-Id: <20200812073529.25715-1-gengcixi@gmail.com> X-Mailer: git-send-email 2.17.1 X-Virus-Scanned: clamav-milter 0.102.4 at in-4.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=-0.0 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-4.smtp.seeweb.it Subject: [LTP] [PATCH 1/2] device-discovery: auto detect UART_DEV devices for uart case X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: orsonzhai@gmail.com, Cixi Geng MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" From: Cixi Geng update device-discovery scripts for uart device, it will auto detect the test machine uart devices, and filtered out of the on using dev. This is an updated version which comes from patch [1] written by Cyril [1] https://patchwork.ozlabs.org/project/ltp/patch/20200623112827.10744-2-chrubis@suse.cz/ Signed-off-by: Cixi Geng --- device-discovery.sh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/device-discovery.sh b/device-discovery.sh index 08460c41f..09993be36 100755 --- a/device-discovery.sh +++ b/device-discovery.sh @@ -1,5 +1,20 @@ #!/bin/sh -if [ "$1" = "UART_RX-UART_TX" ]; then - echo "UART_RX=/dev/ttyUSB0 UART_TX=/dev/ttyUSB0" +find_uart_devices() +{ + UART_DEVICE="" + for i in /dev/tty*; do + TTY_DEVICES=`echo $i |grep "tty[[:alpha:]]\{1,\}[0-9]\{1,\}"` + if [ -n "${TTY_DEVICES}" ];then + if ( stty -a -F ${TTY_DEVICES} > /dev/null 2>&1 ) ;then + lsof | grep "${TTY_DEVICES}" 1>/dev/null 2>&1 || \ + UART_DEVICE="${TTY_DEVICES} ${UART_DEVICE}" + fi + fi + done + echo "UART_DEV=${UART_DEVICE}" +} + +if [ "$1" = "UART_DEV" ]; then + find_uart_devices fi From patchwork Wed Aug 12 07:35:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cixi Geng X-Patchwork-Id: 1343552 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.linux.it (client-ip=2001:1418:10:5::2; helo=picard.linux.it; envelope-from=ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=eCFpEEnX; dkim-atps=neutral Received: from picard.linux.it (picard.linux.it [IPv6:2001:1418:10:5::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BRM3s66fHz9sTS for ; Wed, 12 Aug 2020 17:37:28 +1000 (AEST) Received: from picard.linux.it (localhost [IPv6:::1]) by picard.linux.it (Postfix) with ESMTP id 503403C310C for ; Wed, 12 Aug 2020 09:37:25 +0200 (CEST) X-Original-To: ltp@lists.linux.it Delivered-To: ltp@picard.linux.it Received: from in-4.smtp.seeweb.it (in-4.smtp.seeweb.it [217.194.8.4]) by picard.linux.it (Postfix) with ESMTP id ECBDE3C3129 for ; Wed, 12 Aug 2020 09:37:22 +0200 (CEST) Received: from mail-pj1-f67.google.com (mail-pj1-f67.google.com [209.85.216.67]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by in-4.smtp.seeweb.it (Postfix) with ESMTPS id 6FC8C10007AB for ; Wed, 12 Aug 2020 09:37:22 +0200 (CEST) Received: by mail-pj1-f67.google.com with SMTP id ha11so687323pjb.1 for ; Wed, 12 Aug 2020 00:37:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=S0iyvq7q60vZ8xHvI7CvdR4AZIcyAa5o/d/+H0LepXY=; b=eCFpEEnXcb/IsaX2lqZF/4+S2DMq9cZ9Pz9VXDbxF4xhPgXf9rp0Ex+7w3bWzFLjNo hQe/WBzlVWaBEYLL+zFEwpJPr+DG/Bzxu+cHUZCx9ySFq+8dxIOgWIfma08YUB9ir8sU Tsn35BmymV2T9CM6e4+MuYzwQhVKjmNjDQ08DqguJy4Fes4A+a0Cy283mk46rXdBhIah YxDJkLL4COaMoDtxZx9YuIvOtFL7UnRhFn8RVHKEHuXx2AKkwKc/VDaJICC9pvBC2mr6 phbL3B70LEvGjTmZdVYa4waWjpHIQY2RnzIHi7Fna1AeokESRfoKa18eGDvfteeL9CQS NYcA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=S0iyvq7q60vZ8xHvI7CvdR4AZIcyAa5o/d/+H0LepXY=; b=qjuyhNYlEFfF3/s8rRRfvHQYrjwzuV5ANeRx4kiWF4xCpPXhGtyl4Z21UTjqQeKYVo B54YKwlagLVjh9toWWTJfX+oIxUTbRez3U+9XVciALiyoV4UZkQHRl7Rsbb2gXBgF6xs G9fyH3stc7H5sfhECxR3nLeUvmHaJLUEauueQl9QIeqGZfmd5Fs+FR9EwN650C3kzToU pTztxibpjkQJGLmKFQmr9am1nUFQrq4d0XFnskGFXgomCwtFobl4iWAfur9kzUSOk+jC xEBsyo6wQi3d1dFCARu4HLtvaMmmSm83/Wm5mxBhEvObhMMZqSJALop4z9dWL/On8iRg Qbvg== X-Gm-Message-State: AOAM530ucoKY9IuBCO8DRpgLrCwAlVuV9WUUhIj3VrFVcpXmGKhc3XwV FHc3BrIlZBZmJ0YpTbrqHTQ= X-Google-Smtp-Source: ABdhPJybTDkT/8D+nVLS6vJxoFxKVVuwZ5aOEYRaBQE+Qlkmh0b4W4PnYn/pwmx22mQKS0frD1LDHQ== X-Received: by 2002:a17:902:b20e:: with SMTP id t14mr4428459plr.58.1597217781025; Wed, 12 Aug 2020 00:36:21 -0700 (PDT) Received: from bj616583pcu.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id g5sm1385069pfh.168.2020.08.12.00.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 12 Aug 2020 00:36:20 -0700 (PDT) From: gengcixi@gmail.com To: chrubis@suse.cz, ceh@ti.com, ltp@lists.linux.it Date: Wed, 12 Aug 2020 15:35:29 +0800 Message-Id: <20200812073529.25715-2-gengcixi@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200812073529.25715-1-gengcixi@gmail.com> References: <20200812073529.25715-1-gengcixi@gmail.com> X-Virus-Scanned: clamav-milter 0.102.4 at in-4.smtp.seeweb.it X-Virus-Status: Clean X-Spam-Status: No, score=-0.0 required=7.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,SPF_HELO_NONE,SPF_PASS autolearn=disabled version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on in-4.smtp.seeweb.it Subject: [LTP] [PATCH 2/2] device_drivers/uart01: uart01 test extension X-BeenThere: ltp@lists.linux.it X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux Test Project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: orsonzhai@gmail.com, Cixi Geng MIME-Version: 1.0 Errors-To: ltp-bounces+incoming=patchwork.ozlabs.org@lists.linux.it Sender: "ltp" From: Cixi Geng expand the uart01 test to support more options: -f: create a file with ramdom content,and test uart use the file to transfer data -l: support to loop test with loop number -k: support loopback mode test modify: make UART_Rx and UART_Tx test into the same UART_DEV for we usually test uart transceiver function together. This is an updated version which comes from patch written by Cyril https://patchwork.ozlabs.org/project/ltp/patch/20200623112827.10744-3-chrubis@suse.cz/ Signed-off-by: Cixi Geng --- runtest/kernel_misc | 10 +- testcases/kernel/device-drivers/Makefile | 1 + testcases/kernel/device-drivers/uart/uart01.c | 94 +++++++++++++++---- 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/runtest/kernel_misc b/runtest/kernel_misc index a7f1d9b56..977a15697 100644 --- a/runtest/kernel_misc +++ b/runtest/kernel_misc @@ -13,8 +13,8 @@ zram01 zram01.sh zram02 zram02.sh zram03 zram03 umip_basic_test umip_basic_test -uart01_9600 uart01 -b 9600 -uart01_19200 uart01 -b 19200 -uart01_38400 uart01 -b 38400 -uart01_57600 uart01 -b 57600 -uart01_115200 uart01 -b 115200 +uart01_9600 uart01 -b 9600 -f binary -k 0 -l 2 +uart01_19200 uart01 -b 19200 -f binary -k 0 -l 3 +uart01_38400 uart01 -b 38400 -f binary -k 0 -l 1 +uart01_57600 uart01 -b 57600 -f binary -k 0 -l 3 +uart01_115200 uart01 -b 115200 -f /binary -k 0 -l 5 diff --git a/testcases/kernel/device-drivers/Makefile b/testcases/kernel/device-drivers/Makefile index 55e0d25a0..be0d88e38 100644 --- a/testcases/kernel/device-drivers/Makefile +++ b/testcases/kernel/device-drivers/Makefile @@ -24,6 +24,7 @@ SUBDIRS := acpi \ locking \ pci \ rcu \ + uart \ rtc \ tbio \ uaccess \ diff --git a/testcases/kernel/device-drivers/uart/uart01.c b/testcases/kernel/device-drivers/uart/uart01.c index 4647c55e3..0501cb462 100644 --- a/testcases/kernel/device-drivers/uart/uart01.c +++ b/testcases/kernel/device-drivers/uart/uart01.c @@ -22,6 +22,10 @@ #include #include "tst_test.h" +#define TIOCM_OUT1 0x2000 +#define TIOCM_OUT2 0x4000 +#define TIOCM_LOOP 0x8000 + static const char hex_asc[] = "0123456789abcdef"; #define hex_asc_lo(x) hex_asc[((x) & 0x0f)] @@ -39,6 +43,7 @@ struct g_opt { #define MODE_DUPLEX (MODE_TX_ONLY | MODE_RX_ONLY) unsigned int mode; unsigned char *cmp_buff; + unsigned char loopback; }; static int vscnprintf(char *buf, size_t size, const char *fmt, va_list args) @@ -187,7 +192,6 @@ static int stress_test_uart_once(struct g_opt *opts, int fd, unsigned char *data .fd = fd, }; int ret; - if (opts->mode & MODE_RX_ONLY && progress_rx < data_len) { pfd.events |= POLLIN; wait_rx = 1; @@ -296,7 +300,6 @@ static int stress_test_uart(struct g_opt *opts, int fd, unsigned char *data, off opts->cmp_buff = SAFE_MALLOC(data_len); memset(opts->cmp_buff, 0, data_len); - do { status = stress_test_uart_once(opts, fd, data, data_len); memset(opts->cmp_buff, 0, data_len); @@ -307,14 +310,30 @@ static int stress_test_uart(struct g_opt *opts, int fd, unsigned char *data, off return status; } +void set_modem(int fd, int bits, int mask) +{ + int status, ret; + + ret = ioctl(fd, TIOCMGET, &status); + if (ret < 0) + tst_brk(TBROK,"mcr get failed: %m\n"); + + status = (status & ~mask) | (bits & mask); + + ret = ioctl(fd, TIOCMSET, &status); + if (ret < 0) + tst_brk(TBROK,"mcr set failed: %m\n"); +} + static int setup_uart(struct g_opt *opts, int open_mode, struct termios *old_term) { struct termios new_term; + struct serial_icounter_struct old_counters; + struct serial_icounter_struct new_counters; int fd; int ret; - - tst_res(TINFO, "Setting up %s speed %u hwflow=%u", - opts->uart_dev, opts->baud_rate, opts->hwflow); + tst_res(TINFO, "Setting up %s speed %u hwflow=%u,loops=%u,loopback %u", + opts->uart_dev, opts->baud_rate, opts->hwflow,opts->loops,opts->loopback); fd = SAFE_OPEN(opts->uart_dev, open_mode | O_NONBLOCK); @@ -347,6 +366,18 @@ static int setup_uart(struct g_opt *opts, int open_mode, struct termios *old_ter tst_brk(TBROK, "tcflush failed: %m\n"); } + ret = fcntl(fd, F_SETFL, 0); + if (ret) + printf("Failed to remove nonblock mode\n"); + + // set loopback modem + + set_modem(fd, opts->loopback ? TIOCM_LOOP : 0, TIOCM_LOOP); + + ret = ioctl(fd, TIOCGICOUNT, &old_counters); + if (ret) + printf("Failed to set loopback mode\n"); + ret = fcntl(fd, F_SETFL, 0); if (ret) printf("Failed to remove nonblock mode\n"); @@ -359,6 +390,7 @@ static void restore_uart(int fd, struct termios *old_term) int ret = tcsetattr(fd, TCSAFLUSH, old_term); if (ret) printf("tcsetattr() of old ones failed: %m\n"); + set_modem(fd, 0, TIOCM_LOOP); } static void print_counters(const char *prefix, @@ -378,6 +410,7 @@ static struct g_opt opts = { .baud_rate = 115200, .loops = 1, .do_termios = 1, + .loopback = 0, }; static char *uart_rx; @@ -404,10 +437,7 @@ void run(void) fd_rx = setup_uart(&opts_in, O_RDONLY, &old_term_rx); - if (!strcmp(uart_rx, uart_tx)) - fd_tx = SAFE_OPEN(uart_tx, O_WRONLY); - else - fd_tx = setup_uart(&opts_out, O_WRONLY, &old_term_tx); + fd_tx = setup_uart(&opts_out, O_WRONLY, &old_term_tx); if (!SAFE_FORK()) { ioctl(fd_rx, TIOCGICOUNT, &old_counters); @@ -439,22 +469,36 @@ void run(void) close(fd_tx); } -static void map_file(const char *fname) +static void map_file(const char *fname,int baud) { struct stat st; + int size; int fd; + char c; + FILE *f_des,*f_src; + + size = baud; - fd = SAFE_OPEN(fname, O_RDONLY); + fd = SAFE_OPEN(fname, O_RDWR|O_CREAT); + f_src = fopen("/dev/urandom","r"); + f_des = fopen(fname,"w+"); SAFE_FSTAT(fd, &st); - data_len = st.st_size; + data_len = size; data = SAFE_MMAP(NULL, data_len, PROT_READ, MAP_SHARED | MAP_LOCKED | MAP_POPULATE, fd, 0); tst_res(TINFO, "Mapped file '%s' size %li bytes", fname, data_len); + while(size--) + { + c = fgetc(f_src); + fputc(c,f_des); + } + fclose(f_des); + fclose(f_src); SAFE_CLOSE(fd); } @@ -479,6 +523,8 @@ static void map_buffer(long buf_size) static char *baud_rate; static char *hwflow; +static char *loops; +static char *loopback; static char *fname; static char *buf_size; @@ -492,17 +538,23 @@ static void setup(void) if (hwflow) opts.hwflow = 1; + if (loops) + tst_parse_int(loops, &(opts.loops), 0, INT_MAX); + + if (loopback) + tst_parse_int(loopback, &(opts.loopback), 0, INT_MAX); + if (fname && buf_size) tst_brk(TBROK, "Only one of -f and -s could be set!"); if (buf_size) tst_parse_long(buf_size, &size, 0, LONG_MAX); - uart_rx = getenv("UART_RX"); - uart_tx = getenv("UART_TX"); + uart_rx = getenv("UART_DEV"); + uart_tx = getenv("UART_DEV"); if (fname) - map_file(fname); + map_file(fname,opts.baud_rate); else map_buffer(size); } @@ -511,12 +563,14 @@ static struct tst_test test = { .setup = setup, .test_all = run, .options = (struct tst_option[]) { - {"b:", &baud_rate, "-b Baud rate (9600, ...)"}, - {"w", &hwflow , "-w Enable hwflow (RTS/CTS)"}, - {"f:", &fname, "-f Binary file for transfers"}, - {"s:", &buf_size, "-s Binary buffer size"}, + {"b:", &baud_rate, "-b Baud rate (9600, ...)"}, + {"w", &hwflow, "-w Enable hwflow (RTS/CTS)"}, + {"f:", &fname, "-f Binary file for transfers"}, + {"l:", &loops, "-l loops to perform(0=>wait for CTRL-C"}, + {"s:", &buf_size, "-s Binary buffer size"}, + {"k:", &loopback, "-k Enable loopback modem"}, {} }, - .needs_devices = (const char *const[]) {"UART_RX", "UART_TX", NULL}, + .needs_devices = (const char *const[]) {"UART_DEV",NULL}, .forks_child = 1, };