From 6ed57d34cab70cfcada21d3b77014f2e834a0cf9 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 27 Feb 2014 01:00:35 -0600 Subject: First pass of logic analyzer functionality (GPMC interface and server) --- servers/fpga_server_lin/src/bbb-gpmc-init.cpp | 42 +++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) (limited to 'servers/fpga_server_lin/src/bbb-gpmc-init.cpp') 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 #include #include +#include #include #include @@ -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) { -- cgit v1.2.3