summaryrefslogtreecommitdiffstats
path: root/servers/fpga_server_lin/src
diff options
context:
space:
mode:
Diffstat (limited to 'servers/fpga_server_lin/src')
-rw-r--r--servers/fpga_server_lin/src/bbb-gpmc-init.cpp42
-rw-r--r--servers/fpga_server_lin/src/bbb-gpmc-init.h7
-rw-r--r--servers/fpga_server_lin/src/fpga_conn.cpp8
3 files changed, 46 insertions, 11 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) {
diff --git a/servers/fpga_server_lin/src/bbb-gpmc-init.h b/servers/fpga_server_lin/src/bbb-gpmc-init.h
index 7b2bc46..993189f 100644
--- a/servers/fpga_server_lin/src/bbb-gpmc-init.h
+++ b/servers/fpga_server_lin/src/bbb-gpmc-init.h
@@ -25,8 +25,11 @@ int setup_gpmc_bbb();
void write_gpmc(unsigned int register_offset, unsigned char data);
unsigned char read_gpmc(unsigned int register_offset);
-void write_gpmc_llong(unsigned int register_offset, unsigned long long data);
-unsigned long long read_gpmc_llong(unsigned int register_offset);
+void write_gpmc_uint16_t(unsigned int register_offset, uint16_t data);
+uint16_t read_gpmc_uint16_t(unsigned int register_offset);
+
+void write_gpmc_uint64_t(unsigned int register_offset, uint64_t data);
+uint64_t read_gpmc_uint64_t(unsigned int register_offset);
void memcpy_from_gpmc(char* destination, unsigned int register_offset, unsigned int length);
void memcpy_to_gpmc(char* source, unsigned int register_offset, unsigned int length); \ No newline at end of file
diff --git a/servers/fpga_server_lin/src/fpga_conn.cpp b/servers/fpga_server_lin/src/fpga_conn.cpp
index 0e1aa17..6ab85a2 100644
--- a/servers/fpga_server_lin/src/fpga_conn.cpp
+++ b/servers/fpga_server_lin/src/fpga_conn.cpp
@@ -235,7 +235,7 @@ int FPGASocket::setupSerial() {
newtio.c_cc[VTIME] = 0; // Inter-character timer unused
newtio.c_cc[VMIN] = 0; // Blocking read unused
-
+
tcflush(m_fd_tty, TCIFLUSH);
tcsetattr(m_fd_tty, TCSANOW, &newtio);
@@ -305,14 +305,14 @@ void FPGASocket::commandLoop() {
cc = readBlock(buffer, 1024);
if (cc > 0) {
ret = write(m_fd_tty, buffer, cc);
-
+
// HACK
// This works around a buffer overflow on FTDI serial devices
// It may not be sufficient for baudrates less than 115200!
if (cc > 128) {
usleep(100000);
}
-
+
while ((ret < 0) && (errno == EAGAIN)) {
usleep(1000);
ret = write(m_fd_tty, buffer, cc);
@@ -354,7 +354,7 @@ void FPGASocket::commandLoop() {
char data[42];
// Read state data from memory map and assemble a reply
- memcpy_from_gpmc(data+0, 0x20, 0x1f); // LCD display
+ memcpy_from_gpmc(data+0, 0x20, 0x20); // LCD display
data[32] = 1; // Input mode (locked to Remote)
data[33] = read_gpmc(0x0b); // Number of address bits of DSP RAM
data[34] = read_gpmc(0x02); // 4-bit LEDs