From patchwork Mon Mar 20 13:45:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frode Isaksen X-Patchwork-Id: 9634221 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8A039602D6 for ; Mon, 20 Mar 2017 13:46:49 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7A7162843A for ; Mon, 20 Mar 2017 13:46:49 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6EBC828449; Mon, 20 Mar 2017 13:46:49 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9F4AD2843A for ; Mon, 20 Mar 2017 13:46:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754521AbdCTNqs (ORCPT ); Mon, 20 Mar 2017 09:46:48 -0400 Received: from mail-wm0-f52.google.com ([74.125.82.52]:38536 "EHLO mail-wm0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753316AbdCTNq3 (ORCPT ); Mon, 20 Mar 2017 09:46:29 -0400 Received: by mail-wm0-f52.google.com with SMTP id t189so64886430wmt.1 for ; Mon, 20 Mar 2017 06:45:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=Sme2BVZqEkoE9xX7XVoh7pZtnt4xCva7+6A2uJzi/jQ=; b=nkjGA91Ch0KhFYQVrtgVyKGptcTdlKaD+8GnRnvRGPyKvEJmnAgh2y3yTrhdUmA7eg rA6IHQyK4MJKSA3seqYl8J+/4S5MXXVXdU1Qvep+7855ixuMq89x6czvInpf/bH1O/EW y4IrpuO2fmuuqXYZXUPRfRKjPMyw2TEP1YCcC5X9UBU8FdG8pG+ETAQ7h499RUUxUxFX r1j9aFVG6HM8qgWyC8L2ON8RJYfzrOWdWHin8fW7Ps5t4USdisBD6ltt9dyiUXPm0y7l nr4waYzFncYP1aIVt1jlYAj4qE35+s1Jly9v/fJsDiLgvAMkLWyfIW0LCGnoZU7aKTBv sPGg== 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=Sme2BVZqEkoE9xX7XVoh7pZtnt4xCva7+6A2uJzi/jQ=; b=K3xylfigCNWe2LzHGykswcGxqm4wUWKe6dgY69UOsv7j48Dy6SjaDwrrI5FxH/KHoZ o6+k9v6dHiU8VdHoJoXYELIXP/Si7aZQMhbY9rf22zzEmlpWEbzVcUwnVALE0jRX1Jwo YrLnxdy/Yd8p3vOMfvvjfxzB3lqDvZctMXgsLQ2In9MZVTQPSXXvtivZ9jh0QQI1BcFY B3zXm2qdCeP+n44nlF4bi4ZXIRuItUbjDK/pIlWyflObwBFy2KiUAAakGRE6jvpJYV0u wuVWGo5+hNlkn+4b/IqE4nywBZTYrOxwP0m53LaU0j9PrEdo83bndnTv0PKTsC053gZ9 fzqA== X-Gm-Message-State: AFeK/H1wR+VlVsDQPxoOdNNFmQM7AjwsiRmMQXDH0guPCIDtqhX3HVRVbNShQ1Ij9ddQdGmw X-Received: by 10.28.141.143 with SMTP id p137mr7381511wmd.62.1490017543163; Mon, 20 Mar 2017 06:45:43 -0700 (PDT) Received: from localhost.localdomain ([90.63.244.31]) by smtp.gmail.com with ESMTPSA id p12sm20973774wrb.46.2017.03.20.06.45.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 20 Mar 2017 06:45:42 -0700 (PDT) From: Frode Isaksen To: nsekhar@ti.com, khilman@baylibre.com, ptitiano@baylibre.com, linux-spi@vger.kernel.org Cc: broonie@kernel.org, Frode Isaksen Subject: [PATCH] spi: spidev_test: add option to continously transfer data Date: Mon, 20 Mar 2017 14:45:35 +0100 Message-Id: <1490017535-31546-1-git-send-email-fisaksen@baylibre.com> X-Mailer: git-send-email 2.7.4 Sender: linux-spi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-spi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add option to send+recv bytes with iterations and show the transfer rate every 5 seconds. Signed-off-by: Frode Isaksen --- tools/spi/spidev_test.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c index 816f119..4375f58 100644 --- a/tools/spi/spidev_test.c +++ b/tools/spi/spidev_test.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,9 @@ static char *output_file; static uint32_t speed = 500000; static uint16_t delay; static int verbose; +static int transfer_size; +static int iterations; +static int interval = 5; /* interval in seconds for showing transfer rate */ uint8_t default_tx[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, @@ -156,7 +160,7 @@ static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len) close(out_fd); } - if (verbose || !output_file) + if (verbose) hex_dump(rx, len, 32, "RX"); } @@ -180,7 +184,9 @@ static void print_usage(const char *prog) " -N --no-cs no chip select\n" " -R --ready slave pulls low to pause\n" " -2 --dual dual transfer\n" - " -4 --quad quad transfer\n"); + " -4 --quad quad transfer\n" + " -S --size transfer size\n" + " -I --iter iterations\n"); exit(1); } @@ -205,11 +211,13 @@ static void parse_opts(int argc, char *argv[]) { "dual", 0, 0, '2' }, { "verbose", 0, 0, 'v' }, { "quad", 0, 0, '4' }, + { "size", 1, 0, 'S' }, + { "iter", 1, 0, 'I' }, { NULL, 0, 0, 0 }, }; int c; - c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v", + c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:vS:I:", lopts, NULL); if (c == -1) @@ -270,6 +278,12 @@ static void parse_opts(int argc, char *argv[]) case '4': mode |= SPI_TX_QUAD; break; + case 'S': + transfer_size = atoi(optarg); + break; + case 'I': + iterations = atoi(optarg); + break; default: print_usage(argv[0]); break; @@ -336,6 +350,61 @@ static void transfer_file(int fd, char *filename) close(tx_fd); } +static uint64_t _read_count; +static uint64_t _write_count; + +static void show_transfer_rate(void) +{ + static int first = 1; + static uint64_t prev_read_count, prev_write_count; + double rx_rate, tx_rate; + + if (first) { + first = 0; + } else { + rx_rate = ((_read_count - prev_read_count) * 8) / (interval*1000.0); + tx_rate = ((_write_count - prev_write_count) * 8) / (interval*1000.0); + + printf("rate: tx %.1fkbps, rx %.1fkbps\n", rx_rate, tx_rate); + } + prev_read_count = _read_count; + prev_write_count = _write_count; +} + +static void transfer_buf(int fd, int len) +{ + uint8_t *tx; + uint8_t *rx; + int i; + + tx = malloc(len); + if (!tx) + pabort("can't allocate tx buffer"); + for (i=0; i < len; i++) + tx[i] = random(); + + rx = malloc(len); + if (!rx) + pabort("can't allocate rx buffer"); + + transfer(fd, tx, rx, len); + + _write_count += len; + _read_count += len; + + if (mode & SPI_LOOP) { + if (memcmp(tx, rx, len)) { + fprintf(stderr, "transfer error !\n"); + hex_dump(tx, len, 32, "TX"); + hex_dump(tx, len, 32, "RX"); + exit(-1); + } + } + + free(rx); + free(tx); +} + int main(int argc, char *argv[]) { int ret = 0; @@ -391,7 +460,25 @@ int main(int argc, char *argv[]) transfer_escaped_string(fd, input_tx); else if (input_file) transfer_file(fd, input_file); - else + else if (transfer_size) { + struct timespec last_stat; + + clock_gettime(CLOCK_MONOTONIC, &last_stat); + show_transfer_rate(); /* initialize */ + + while (iterations-- > 0) { + struct timespec current; + + transfer_buf(fd, transfer_size); + + clock_gettime(CLOCK_MONOTONIC, ¤t); + if (current.tv_sec - last_stat.tv_sec > interval) { + show_transfer_rate(); + last_stat = current; + } + } + printf("total: tx %.1fKB, rx %.1fKB\n", _write_count/1024.0, _read_count/1024.0); + } else transfer(fd, default_tx, default_rx, sizeof(default_tx)); close(fd);