From f6a80713cf7f27bdb7e4fbbade8db3ea8bebc7d6 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Wed, 23 Apr 2025 14:23:15 +0800
Subject: [PATCH] update w25qflash to specify spidev

---
 modules/w25qflash.c |  158 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 93 insertions(+), 65 deletions(-)

diff --git a/modules/w25qflash.c b/modules/w25qflash.c
index 449a9c7..ae54646 100644
--- a/modules/w25qflash.c
+++ b/modules/w25qflash.c
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <errno.h>
+#include <libgen.h>
 #include <getopt.h>
 #include <fcntl.h>
 #include <time.h>
@@ -55,21 +56,75 @@
  *|   Entry Functions     |
  *+-----------------------+*/
 
-void dump_buf(const char *prompt, char *buf, size_t len);
+void dump_buf(const char *prompt, char *buffer, size_t length);
+
+static inline void banner(const char *progname)
+{
+    printf("%s program Version v1.0.0\n", progname);
+    printf("Copyright (C) 2023 Avnet.\n");
+}
+
+static void program_usage(const char *progname)
+{
+
+    printf("Usage: %s [OPTION]...\n", progname);
+    printf(" %s is W25Q SPI Norflash test program. \n", progname);
+
+    printf(" -d[device  ]  Specify SPI device, such as /dev/spidevX.Y\n");
+    printf(" -h[help    ]  Display this help information\n");
+    printf(" -v[version ]  Display the program version\n");
+
+    printf("\n");
+    banner(progname);
+    return;
+}
+
+char           *dev="/dev/spidev0.0"; /* SPI device 0 */
 
 int main (int argc, char **argv)
 {
+    int             rv;
+    char           *progname=NULL;
+    struct option   long_options[] = {
+        {"device", required_argument, NULL, 'd'},
+        {"version", no_argument, NULL, 'v'},
+        {"help", no_argument, NULL, 'h'},
+        {NULL, 0, NULL, 0}
+    };
+
+    progname = basename(argv[0]);
+
+    /* Parser the command line parameters */
+    while ((rv = getopt_long(argc, argv, "d:m:vh", long_options, NULL)) != -1)
+    {
+        switch (rv)
+        {
+            case 'd': /*  Set SPI device path: /dev/spidev0.0 */
+                dev = optarg;
+                break;
+
+            case 'v':  /*  Get software version */
+                banner(progname);
+                return EXIT_SUCCESS;
+
+            case 'h':  /*  Get help information */
+                program_usage(progname);
+                return 0;
+
+            default:
+                break;
+        }
+    }
+
     spinor_test();
 
     return 0;
 }
 
-
 /*+-----------------------+
  *|   SPI API Functions   |
  *+-----------------------+*/
 
-#define SPI_DEV                         "/dev/spidev0.0"
 #define SPI_BITS                        8
 #define SPI_MODE                        0//(SPI_CPHA|SPI_CPOL)
 #define SPI_SPEED                       500000
@@ -84,10 +139,10 @@
     uint32_t            request;
     int                 ret;
 
-    spi->hspi = open(SPI_DEV, O_RDWR);
+    spi->hspi = open(dev, O_RDWR);
     if (spi->hspi < 0)
     {
-        spinor_print("ERROR: open device %s failure: %s\r\n", SPI_DEV, strerror(errno));
+        spinor_print("ERROR: open device %s failure: %s\r\n", dev, strerror(errno));
         return ;
     }
 
@@ -781,74 +836,47 @@
     return ;
 }
 
-#define LINELEN 81
-#define CHARS_PER_LINE 16
-static char *print_char =
-"                "
-"                "
-" !\"#$%&'()*+,-./"
-"0123456789:;<=>?"
-"@ABCDEFGHIJKLMNO"
-"PQRSTUVWXYZ[\\]^_"
-"`abcdefghijklmno"
-"pqrstuvwxyz{|}~ "
-"                "
-"                "
-" ???????????????"
-"????????????????"
-"????????????????"
-"????????????????"
-"????????????????"
-"????????????????";
-
-void dump_buf(const char *prompt, char *buf, size_t len)
+void dump_buf(const char *prompt, char *buffer, size_t length)
 {
-    int rc;
-    int idx;
-    char prn[LINELEN];
-    char lit[CHARS_PER_LINE + 2];
-    char hc[4];
-    short line_done = 1;
+    size_t i, j;
 
-    if( prompt )
-        printf("%s", prompt);
-
-    rc = len;
-    idx = 0;
-    lit[CHARS_PER_LINE] = '\0';
-
-    while (rc > 0)
+    if (prompt)
     {
-        if (line_done)
-            snprintf(prn, LINELEN, "%08X: ", idx);
-
-        do
-        {
-            unsigned char c = buf[idx];
-            snprintf(hc, 4, "%02X ", c);
-            strncat(prn, hc, LINELEN);
-
-            lit[idx % CHARS_PER_LINE] = print_char[c];
-        }
-        while (--rc > 0 && (++idx % CHARS_PER_LINE != 0));
-
-        line_done = (idx % CHARS_PER_LINE) == 0;
-        if (line_done)
-        {
-            printf("%s  %s\r\n", prn, lit);
-        }
+        printf("%s\n", prompt);
     }
 
-    if (!line_done)
+    for (i = 0; i < length; i += 16)
     {
-        int ldx = idx % CHARS_PER_LINE;
-        lit[ldx++] = print_char[(int)buf[idx]];
-        lit[ldx] = '\0';
+        printf("%08zx: ", i);
 
-        while ((++idx % CHARS_PER_LINE) != 0)
-            strncat(prn, "   ", sizeof(prn)-strlen(prn));
+        for (j = 0; j < 16; j++)
+        {
+            if (i + j < length)
+            {
+                printf("%02x ", buffer[i + j]);
+            }
+            else
+            {
+                printf("   ");
+            }
+        }
 
-        printf("%s  %s\r\n", prn, lit);
+        printf(" ");
 
+        for (j = 0; j < 16; j++)
+        {
+            if (i + j < length)
+            {
+                unsigned char c = buffer[i + j];
+                printf("%c", (c >= 32 && c <= 126) ? c : '.');
+            }
+            else
+            {
+                printf(" ");
+            }
+        }
+
+        printf("\n");
     }
 }
+

--
Gitblit v1.9.1