Преглед изворни кода

Pad data when writing to FPGA

Matthias Vogelgesang пре 8 година
родитељ
комит
aaa7f29894
1 измењених фајлова са 34 додато и 19 уклоњено
  1. 34 19
      ddrio.c

+ 34 - 19
ddrio.c

@@ -136,7 +136,36 @@ reset_ddr_data (pcilib_t *pci, volatile void *bar, Options *opts)
     /* write only in DDR mode, disable read */
     WR32_sleep (HF_REG_CONTROL,
                 HF_CONTROL_SOURCE_RX_FIFO);
+}
+
+static void
+copy_data (volatile void *bar, char *data, size_t size, Options *opts)
+{
+    if (opts->verbose)
+        printf ("Writing %zu bytes\n", size);
 
+    switch (opts->copy) {
+        case COPY_MEMCPY:
+            memcpy (bar + 0x9400, data, size);
+            break;
+        case COPY_UINT64:
+            {
+                uint64_t *src = (uint64_t *) data;
+                uint64_t *dst = (uint64_t *) (bar + 0x9400);
+                int remaining;
+
+                for (size_t i = 0; i < size / 8; i++)
+                    dst[0] = src[i];
+
+                remaining = size % 8;
+
+                for (int i = 0; i < remaining; i++)
+                    ((uint8_t *) bar + 0x9400)[0] = data[size - 1 - i];
+            }
+            break;
+        default:
+            break;
+    }
 }
 
 static void
@@ -169,27 +198,13 @@ write_to_ddr (pcilib_t *pci, volatile void *bar, Options *opts)
                  read_size, size);
     }
 
-    switch (opts->copy) {
-        case COPY_MEMCPY:
-            memcpy (bar + 0x9400, data, size);
-            break;
-        case COPY_UINT64:
-            {
-                uint64_t *src = (uint64_t *) data;
-                uint64_t *dst = (uint64_t *) (bar + 0x9400);
-                int remaining;
-
-                for (size_t i = 0; i < size / 8; i++)
-                    dst[0] = src[i];
+    copy_data (bar, data, size, opts);
 
-                remaining = size % 8;
+    if (size % 32) {
+        size_t remaining = 32 - size % 32;
 
-                for (int i = 0; i < remaining; i++)
-                    ((uint8_t *) bar + 0x9400)[0] = data[size - 1 - i];
-            }
-            break;
-        default:
-            break;
+        memset (data, 0, remaining);
+        copy_data (bar, data, remaining, opts);
     }
 
     free (data);