diff options
Diffstat (limited to 'servers/fpga_server_lin/src')
-rw-r--r-- | servers/fpga_server_lin/src/bbb-gpmc-init.cpp | 42 | ||||
-rw-r--r-- | servers/fpga_server_lin/src/bbb-gpmc-init.h | 7 | ||||
-rw-r--r-- | servers/fpga_server_lin/src/fpga_conn.cpp | 8 |
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 |