Prechádzať zdrojové kódy

Тестирование DMA

Anatoliy Chigirinskiy 1 rok pred
rodič
commit
70fd911974
3 zmenil súbory, kde vykonal 55 pridanie a 98 odobranie
  1. 1 0
      CMakeLists.txt
  2. 54 1
      main.c
  3. 0 97
      utils.c

+ 1 - 0
CMakeLists.txt

@@ -9,6 +9,7 @@ add_executable(TMSG44_CoolPi command.c main.c
         Devices/dac8811.c
         Devices/max2870.c
         Devices/pe43711.c
+        DmaUtils/utils.c
         Devices/potentiometer.c
         Devices/tmsgheaders.c)
 

+ 54 - 1
main.c

@@ -20,19 +20,23 @@
 #include "Devices//ad9912.h"
 #include "Devices/pe43711.h"
 #include "Devices//potentiometer.h"
+#include "DmaUtils//utils.h"
 
 #include "command.h"
 
 
 #define REQUESTED_MEMORY_SIZE  0x1000
+#define BUFF_SIZE			   2048
 #define SERVER_PORT 5025
 #define BACKLOG 10
 
 volatile int conn_fd = 0;
 volatile int pci_fd = 0;
+volatile int dma_fd = 0;
 int listen_fd = 0;
 
 void *bar1;
+void *bar0;
 reg_addr_pci* pci_bar_1;
 
 //Обработчик ошибок
@@ -48,6 +52,11 @@ void error(const char *msg)
     {
         close(pci_fd);
     }
+	if (dma_fd != 0) 
+	{
+		close(dma_fd);
+	}
+
     munmap(bar1, REQUESTED_MEMORY_SIZE);
 	exit(1);
 } 
@@ -70,6 +79,10 @@ void handle_close_signal(int signal)
         {
             close(pci_fd);
         }
+		if (dma_fd != 0)
+		{
+			close(dma_fd);
+		}
         munmap(bar1, REQUESTED_MEMORY_SIZE);
 		exit(0);
 	}
@@ -77,7 +90,10 @@ void handle_close_signal(int signal)
 
 int main(int argc, char *argv[])
 {
-	char *filename = "/dev/MyDmaModule";
+	char *filename = "/dev/MyDmaModule-1";
+	char *filename_dma = "/dev/MyDmaModule-0";
+	int rc;
+	int rv;
 
 	struct timeval  tv;
 	// Длина структуры адреса
@@ -103,6 +119,13 @@ int main(int argc, char *argv[])
         return 1;
     }
 
+	dma_fd = open(filename_dma, O_RDWR | O_SYNC);
+	if (dma_fd == -1) {
+		int error = errno;
+		fprintf(stderr, "Cannot open DMA device file: %s\n", strerror(error));
+		return 1;
+	}
+
     bar1 = mmap(NULL, REQUESTED_MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, pci_fd, 0);
     if (bar1 == MAP_FAILED) {
         perror("mmap");
@@ -127,6 +150,36 @@ int main(int argc, char *argv[])
 
 	usleep(1000);
 	
+	char *user_buffer = (char *) malloc(BUFF_SIZE);
+	char *user_buffer_read = (char *) malloc(BUFF_SIZE);
+
+	for (int i = 0; i < BUFF_SIZE; i++) {
+		/*fill the buffer with random data*/
+		user_buffer[i] = (char) (rand() % 256);
+	}
+
+	rc = write_to_buffer (filename_dma, dma_fd, user_buffer, BUFF_SIZE, 0);
+	if (rc < 0) {
+		fprintf(stderr, "write_to_buffer failed\n");
+		return 1;
+	}
+	/*wait for data to be written*/ 
+	usleep(5);
+	rv = read_from_buffer (filename_dma, dma_fd, user_buffer_read, BUFF_SIZE, 0);
+	if (rv < 0) {
+		fprintf(stderr, "read_from_buffer failed\n");
+		return 1;
+	}
+	/*Check if the user buffer and the read buffer are the same*/
+	if (memcmp(user_buffer, user_buffer_read, BUFF_SIZE) != 0) {
+		fprintf(stderr, "Data mismatch\n");
+		return 1;
+	}
+	else {
+		fprintf(stderr, "Data match\n");
+	}
+
+
 	// Установка режима SPI
 	uint32_t cfg_reg = get_cfg_reg();
 	SET_REGISTER_PARAM(cfg_reg, CFG_REG_SPI_MODE_BITM, CFG_REG_SPI_MODE_BITP, CFG_REG_SPI_MODE_4MOSI);

+ 0 - 97
utils.c

@@ -1,97 +0,0 @@
-#include <stdio.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <errno.h>
-
-#define RW_MAX_SIZE    0x7ffff000
-
-
-ssize_t read_from_buffer(char *fname, int fd, char *buffer, uint64_t size, uint64_t base) {
-    ssize_t rc;
-    char *buf = buffer;
-    off_t offset = base;
-    size_t count = 0;
-    int loop = 0;
-
-    while (count < size) {
-        uint64_t bytes = size - count;
-
-        if (bytes > RW_MAX_SIZE) {
-            bytes = RW_MAX_SIZE;
-        }
-        if (offset) {
-            rc = lseek(fd, offset, SEEK_SET);
-            if (rc != offset) {
-                fprintf(stderr, "%s, seek off 0x%lx != 0x%lx\n", fname, rc, offset);
-                perror("seek file");
-                return -EIO;
-            }
-        }
-        /* Read data from file into buffer */
-        rc = read(fd, buf, bytes);
-        if (rc < 0) {
-            fprintf(stderr, "%s, read failed\n", fname);
-            perror("read file");
-            return -EIO;
-        }
-        count += rc;
-        if (rc != bytes) {
-            fprintf(stderr, "%s, read failed, rc=%ld, bytes=%ld\n", fname, rc, bytes);
-            break;
-        }
-        buf += bytes;
-        offset += bytes;
-        loop++;
-    }
-    if (count != size && loop) {
-        fprintf(stderr, "%s, read failed, count=%ld, size=%ld\n", fname, count, size);
-        return -EIO;
-    }
-    return count;
-}
-
-ssize_t write_to_buffer(char *fname, int fd, char *buffer, uint64_t size, uint64_t base) {
-    ssize_t rc;
-    char *buf = buffer;
-    off_t offset = base;
-    size_t count = 0;
-    int loop = 0;
-
-    while (count < size) {
-        uint64_t bytes = size - count;
-
-        if (bytes > RW_MAX_SIZE) {
-            bytes = RW_MAX_SIZE;
-        }
-        if (offset) {
-            rc = lseek(fd, offset, SEEK_SET);
-            if (rc != offset) {
-                fprintf(stderr, "%s, seek off 0x%lx != 0x%lx\n", fname, rc, offset);
-                perror("seek file");
-                return -EIO;
-            }
-        }
-        /* Write data from buffer into file */
-        rc = write(fd, buf, bytes);
-        if (rc < 0) {
-            fprintf(stderr, "%s,write 0x%lx @ 0x%lx @ 0x%lx failed %ld.\n", fname, bytes, offset, rc);
-            perror("write file");
-            return -EIO;
-        }
-        count += rc;
-        printf("count = %ld, bytes = %ld\n", count, size);
-        if (rc != bytes) {
-            fprintf(stderr, "%s, write underflow 0x%lx/0x%lx @ 0x%lx.\n", fname, rc, bytes, offset);
-            break;
-        }
-        buf += bytes;
-        offset += bytes;
-        loop++;
-    }
-    if (count != size && loop) {
-        fprintf(stderr, "%s, write underflow, 0x%lx/0x%lx.\n", fname, count, size);
-        return -EIO;
-    }
-    return count;
-}