summaryrefslogtreecommitdiffstats
path: root/servers/fpga_server_lin/src/bbb-gpmc-init.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'servers/fpga_server_lin/src/bbb-gpmc-init.cpp')
-rw-r--r--servers/fpga_server_lin/src/bbb-gpmc-init.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/servers/fpga_server_lin/src/bbb-gpmc-init.cpp b/servers/fpga_server_lin/src/bbb-gpmc-init.cpp
index ac6b1b6..64e8014 100644
--- a/servers/fpga_server_lin/src/bbb-gpmc-init.cpp
+++ b/servers/fpga_server_lin/src/bbb-gpmc-init.cpp
@@ -28,6 +28,7 @@
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
+#include <stdint.h>
#include <stdio.h>
#include <errno.h>
@@ -61,7 +62,6 @@ char *gpio_mem, *gpio_map, *gpmc_map;
// I/O access
volatile unsigned int *gpio = NULL;
volatile unsigned char *gpio_char = NULL;
-volatile unsigned char *gpio_llong = NULL;
volatile unsigned int *gpmc = NULL;
void gpmc_mapregisters() {
@@ -171,12 +171,44 @@ unsigned char read_gpmc(unsigned int register_offset) {
return *(gpio_char + register_offset);
}
-void write_gpmc_llong(unsigned int register_offset, unsigned long long data) {
- *(gpio_char + register_offset) = data;
+void write_gpmc_uint16_t(unsigned int register_offset, uint16_t data) {
+ register_offset = register_offset * 2;
+ *(gpio_char + register_offset + 0) = ((data & 0xff00) >> 8);
+ *(gpio_char + register_offset + 1) = ((data & 0x00ff) >> 0);
}
-unsigned long long read_gpmc_llong(unsigned int register_offset) {
- return *(gpio_char + register_offset);
+uint16_t read_gpmc_uint16_t(unsigned int register_offset) {
+ uint16_t result = 0;
+ register_offset = register_offset * 2;
+ result = result | ((uint16_t)(*(gpio_char + register_offset + 0)) << 8);
+ result = result | ((uint16_t)(*(gpio_char + register_offset + 1)) << 0);
+ return result;
+}
+
+void write_gpmc_uint64_t(unsigned int register_offset, uint64_t data) {
+ register_offset = register_offset * 8;
+ *(gpio_char + register_offset + 0) = ((data & 0xff00000000000000) >> 56);
+ *(gpio_char + register_offset + 1) = ((data & 0x00ff000000000000) >> 48);
+ *(gpio_char + register_offset + 2) = ((data & 0x0000ff0000000000) >> 40);
+ *(gpio_char + register_offset + 3) = ((data & 0x000000ff00000000) >> 32);
+ *(gpio_char + register_offset + 4) = ((data & 0x00000000ff000000) >> 24);
+ *(gpio_char + register_offset + 5) = ((data & 0x0000000000ff0000) >> 16);
+ *(gpio_char + register_offset + 6) = ((data & 0x000000000000ff00) >> 8);
+ *(gpio_char + register_offset + 7) = ((data & 0x00000000000000ff) >> 0);
+}
+
+uint64_t read_gpmc_uint64_t(unsigned int register_offset) {
+ uint64_t result = 0;
+ register_offset = register_offset * 8;
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 0)) << 56);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 1)) << 48);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 2)) << 40);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 3)) << 32);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 4)) << 24);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 5)) << 16);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 6)) << 8);
+ result = result | ((uint64_t)(*(gpio_char + register_offset + 7)) << 0);
+ return result;
}
void memcpy_from_gpmc(char* destination, unsigned int register_offset, unsigned int length) {