summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--exynos4412_gpios.c75
-rw-r--r--exynos4412_gpios.h15
-rw-r--r--exynos4412_gpios_data.c41
-rw-r--r--exynos4412_gpios_data.h7
-rw-r--r--main.c88
-rw-r--r--memory.c171
-rw-r--r--memory.h7
-rw-r--r--modem_gpios_data.c15
-rw-r--r--modem_gpios_data.h7
-rw-r--r--tests.c74
-rw-r--r--tests.h5
11 files changed, 262 insertions, 243 deletions
diff --git a/exynos4412_gpios.c b/exynos4412_gpios.c
index e9b4b2f..9da5e41 100644
--- a/exynos4412_gpios.c
+++ b/exynos4412_gpios.c
@@ -25,44 +25,9 @@
#include "exynos4412_gpios.h"
#include "exynos4412_gpios_data.h"
-void *mmap_gpio_hardware_blocks(int debug, char *devmem, int fd,
- size_t page_size)
+int dump_gpio_infos(int debug, struct memory_mapping *memory_mapping,
+ char *bank, uint32_t gpio_offset)
{
- uint32_t base_addr;
- uint32_t *virt_addr;
- off_t len;
- int rc;
-
- /* GPIO_right: base_addr: 0x11000000 len: 0x400000
- * GPIO_left: base_addr: 0x11400000 len: 0x400000
- */
- base_addr = 0x11000000u;
- len = 0x800000;
-
- /* virt_addr points to the beining of the file, so to the physical
- * address 0
- */
- virt_addr = mmap(0, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd,
- base_addr);
- if (virt_addr == MAP_FAILED) {
- rc = errno;
- printf("mmap on %s failed with error %d: %s\n",
- devmem, rc, strerror(rc));
- errno = rc;
- return NULL;
- }
-
- if (debug)
- printf("%s: mapped address 0 @ %p\n", __func__, virt_addr);
-
- return virt_addr;
-}
-
-int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr, char *bank,
- uint32_t gpio_offset)
-{
- uint32_t *addr;
int rc;
int i = 0;
off_t offset = 0;
@@ -78,18 +43,11 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size,
}
- addr = gpio_hardware_blocks_addr + offset;
-
- if (debug) {
- printf("%s: Mapped at %p\n", __func__, addr);
- print_gpio_banks_data();
- }
-
printf("%s: %s[%d]: {\n", __func__, bank, gpio_offset);
for (i=0; i< sizeof(gpio_registers) / sizeof (char*); i++) {
rc = decode_gpio_data(debug, bank, gpio_offset,
- gpio_registers[i], addr);
+ gpio_registers[i], memory_mapping);
if (rc == -1) {
rc = errno;
printf("%s:"
@@ -97,14 +55,13 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size,
" bank=%s,"
" gpio_offset=%d,"
" gpio_register_name=%s,"
- " addr=%p);"
+ " memory_mapping);"
" failed with with error %d: %s\n",
__func__,
debug,
bank,
gpio_offset,
gpio_registers[i],
- addr,
rc, strerror(rc));
return -1;
}
@@ -116,11 +73,9 @@ int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size,
return 0;
}
-int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr,
+int gpio_get_direction(int debug, struct memory_mapping *memory_mapping,
char *bank, uint32_t gpio_offset)
{
- uint32_t *addr;
int rc;
int err;
off_t offset = 0;
@@ -133,16 +88,14 @@ int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size,
return -1;
}
- addr = gpio_hardware_blocks_addr + offset;
-
- rc = decode_gpio_data(debug, bank, gpio_offset, "con", addr);
+ rc = decode_gpio_data(debug, bank, gpio_offset, "con", memory_mapping);
if (rc == -1)
err = errno;
if(debug)
printf("%s: decode_gpio_data(debug=%d, bank=%s, gpio_offset=%d,"
- " gpio_register_name=%s, addr=%p);\n",
- __func__, debug, bank, gpio_offset, "con", addr);
+ " gpio_register_name=%s, memory_mapping);\n",
+ __func__, debug, bank, gpio_offset, "con");
if (rc == -1) {
printf("%s: decode_gpio_data failed with error %d: %s\n",
@@ -153,11 +106,9 @@ int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size,
return rc;
}
-int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr,
+int gpio_get_output_value(int debug, struct memory_mapping *memory_mapping,
char *bank, uint32_t gpio_offset)
{
- uint32_t *addr;
int rc;
off_t offset = 0;
@@ -172,25 +123,21 @@ int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size,
if (debug)
printf("%s: offset for %s: 0x%lx\n\n", __func__, bank, offset);
- addr = gpio_hardware_blocks_addr + offset;
-
rc = decode_gpio_data(debug, bank, gpio_offset,
- "dat", addr);
+ "dat", memory_mapping);
if (rc == -1) {
rc = errno;
printf("%s:"
" decode_gpio_data(debug=%d,"
" bank=%s,"
" gpio_offset=%d,"
- " gpio_register_name=%s,"
- " addr=%p);"
+ " gpio_register_name=%s, memory_mapping);"
" failed with with error %d: %s\n",
__func__,
debug,
bank,
gpio_offset,
"dat",
- addr,
rc, strerror(rc));
return -1;
}
diff --git a/exynos4412_gpios.h b/exynos4412_gpios.h
index 754aab0..a62dca1 100644
--- a/exynos4412_gpios.h
+++ b/exynos4412_gpios.h
@@ -20,17 +20,14 @@
#include <stdint.h>
-int dump_gpio_infos(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr, char *bank,
- uint32_t gpio_offset);
-int gpio_get_direction(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr,
+#include "memory.h"
+
+int dump_gpio_infos(int debug, struct memory_mapping *memory_mapping,
+ char *bank, uint32_t gpio_offset);
+int gpio_get_direction(int debug, struct memory_mapping *memory_mapping,
char *bank, uint32_t gpio_offset);
-int gpio_get_output_value(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr,
+int gpio_get_output_value(int debug, struct memory_mapping *memory_mapping,
char *bank, uint32_t gpio_offset);
-void *mmap_gpio_hardware_blocks(int debug, char *devmem, int fd,
- size_t page_size);
#endif /* EXYNOS4412_GPIOS_H */
diff --git a/exynos4412_gpios_data.c b/exynos4412_gpios_data.c
index ac2f77d..deed252 100644
--- a/exynos4412_gpios_data.c
+++ b/exynos4412_gpios_data.c
@@ -379,13 +379,14 @@ void print_gpio_banks_data(void)
}
int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset,
- char* gpio_register_name, uint32_t *virt_addr)
+ char* gpio_register_name,
+ struct memory_mapping *memory_mapping)
{
struct gpio_bank_data *gpio_bank_data;
struct gpio_register_data *gpio_register_data;
-
- uint32_t *addr;
- uint32_t register_value;
+ unsigned int addr;
+ unsigned int register_value;
+ int rc;
gpio_bank_data = get_gpio_bank_data(bank);
if (gpio_bank_data == NULL) {
@@ -399,12 +400,28 @@ int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset,
return -1;
}
- addr = virt_addr + gpio_bank_data->offset + gpio_register_data->offset;
- register_value = *virt_addr;
+ addr = get_gpio_register_offset(debug, bank, gpio_register_name);
+ if (addr == -1) {
+ printf("%s: get_gpio_register_offset failed with error %d\n",
+ __func__, addr);
+ return -1;
+ }
+
+ if (debug)
+ printf("%s: register address: 0x%llx\n",
+ __func__, (long long int)addr);
+
+ rc = read_word(debug, memory_mapping, addr, &register_value);
+ if (rc == -1) {
+ rc = errno;
+ printf("%s: read_word failed with error %d: %s\n",
+ __func__, rc, strerror(rc));
+ return -1;
+ }
if (debug)
- printf("%s: %s: offset 0x%x value: 0x%x\n", __func__, bank,
- addr - virt_addr, register_value);
+ printf("%s: %s @ 0x%x = 0x%x\n", __func__, bank,
+ addr, register_value);
return gpio_register_data->get_value(register_value, gpio_offset);
}
@@ -427,7 +444,6 @@ off_t get_gpio_register_offset(int debug, char *gpio_bank_name,
{
struct gpio_bank_data *gpio_bank_data;
struct gpio_register_data *gpio_register_data;
- off_t gpio_hardware_block_offset = 0;
off_t offset = 0;
gpio_bank_data = get_gpio_bank_data(gpio_bank_name);
@@ -448,10 +464,9 @@ off_t get_gpio_register_offset(int debug, char *gpio_bank_name,
return -1;
}
- if (gpio_bank_data->base == 0x11400000)
- gpio_hardware_block_offset = 0x400000;
-
- offset = gpio_hardware_block_offset + gpio_bank_data->offset + gpio_register_data->offset;
+ offset = gpio_bank_data->base + \
+ gpio_bank_data->offset + \
+ gpio_register_data->offset;
return offset;
}
diff --git a/exynos4412_gpios_data.h b/exynos4412_gpios_data.h
index c66ae8b..267b045 100644
--- a/exynos4412_gpios_data.h
+++ b/exynos4412_gpios_data.h
@@ -18,6 +18,8 @@
#ifndef EXYNOS4412_GPIOS_DATA_H
#define EXYNOS4412_GPIOS_DATA_H
+#include "memory.h"
+
struct gpio_bank_data {
char *name;
uint32_t nr_gpios;
@@ -86,14 +88,13 @@ enum gpio_power_down {
};
int decode_gpio_data(int debug, char *bank, uint32_t gpio_offset,
- char* gpio_register_name, uint32_t *virt_addr);
+ char* gpio_register_name,
+ struct memory_mapping *memory_mapping);
int get_bank_gpio_numbers(int debug, char *gpio_bank_name);
struct gpio_bank_data *get_gpio_bank_data(char *bank);
off_t get_gpio_register_offset(int debug, char *gpio_bank_name,
char *register_name);
char *gpio_data_str(char* gpio_register_name, uint32_t register_value);
-void *mmap_gpio_bank(int debug, char *devmem, int fd, size_t page_size,
- char *bank);
void print_gpio_banks_data(void);
#endif /* EXYNOS4412_GPIOS_DATA_H */
diff --git a/main.c b/main.c
index 226cb59..e608022 100644
--- a/main.c
+++ b/main.c
@@ -29,6 +29,7 @@
#include "compatible_devices.h"
#include "exynos4412_gpios.h"
#include "exynos4412_gpios_data.h"
+#include "memory.h"
#include "modem_gpios_data.h"
#include "tests.h"
@@ -51,13 +52,11 @@ int usage(char* progname)
return 0;
}
-int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr)
+int dump_flash_gpio_status(int debug, struct memory_mapping *memory_mapping)
{
int rc;
- rc = dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpj1", 1);
+ rc = dump_gpio_infos(debug, memory_mapping, "gpj1", 1);
if (rc == -1) {
printf("dump_gpio_infos failed with error %d\n", rc);
@@ -68,13 +67,11 @@ int dump_flash_gpio_status(int debug, char* devmem, int fd, size_t page_size,
return 0;
}
-int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr)
+int dump_flash_gps_status(int debug, struct memory_mapping *memory_mapping)
{
int rc;
- rc = dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpl2", 1);
+ rc = dump_gpio_infos(debug, memory_mapping, "gpl2", 1);
if (rc == -1) {
printf("dump_gpio_infos failed with error %d\n", rc);
@@ -82,8 +79,7 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size,
return EX_UNAVAILABLE;
}
- rc = dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpl2", 2);
+ rc = dump_gpio_infos(debug, memory_mapping, "gpl2", 2);
if (rc == -1) {
printf("dump_gpio_infos failed with error %d\n", rc);
@@ -94,8 +90,8 @@ int dump_flash_gps_status(int debug, char* devmem, int fd, size_t page_size,
return 0;
}
-int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr, char* bank)
+int dump_gpio_bank_status(int debug, struct memory_mapping *memory_mapping,
+ char* bank)
{
int i;
int nr_gpios;
@@ -112,8 +108,7 @@ int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size,
}
for (i=0; i < nr_gpios; i++) {
- rc = dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, bank, i);
+ rc = dump_gpio_infos(debug, memory_mapping, bank, i);
if (rc == -1) {
printf("dump_gpio_infos failed with error %d\n", rc);
@@ -127,13 +122,10 @@ int dump_gpio_bank_status(int debug, char* devmem, int fd, size_t page_size,
int main(int argc, char *argv[])
{
- int fd = 0;
- int rc = 0;
- int debug = 0;
+ struct memory_mapping *memory_mapping;
- char *devmem = "/dev/mem";
- size_t page_size = 4096;
- void *gpio_hardware_blocks_addr;
+ int debug = 1;
+ int rc;
assert(argc >= 1);
@@ -147,21 +139,6 @@ int main(int argc, char *argv[])
return 0;
}
- /*
- * TODO: check if root or tell the user to become root in case or
- * access error
- */
-
- fd = open(devmem, O_RDWR | O_SYNC);
- if (fd == -1) {
- rc = errno;
- printf("Opening %s failed with error %d: %s\n",
- devmem, rc, strerror(rc));
-
- /* TODO: return more precise error */
- return EX_UNAVAILABLE;
- }
-
if (strcmp("flash", argv[1]) &&
strcmp("gpl1", argv[1]) &&
strcmp("gpl2", argv[1]) &&
@@ -173,45 +150,36 @@ int main(int argc, char *argv[])
return EX_USAGE;
}
- gpio_hardware_blocks_addr = mmap_gpio_hardware_blocks(debug, devmem, fd,
- page_size);
- if (gpio_hardware_blocks_addr == NULL) {
- /* mmap_gpio_bank already prints an error */
- goto end;
+ rc = init_memory_mapping(debug, &memory_mapping);
+ if (rc == -1) {
+ printf("%s: init_memory_mapping failed with error %d\n",
+ __func__, rc);
+ return EX_UNAVAILABLE;
}
if (argc == 2 && !strcmp("flash", argv[1])) {
- return dump_flash_gpio_status(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr);
+ return dump_flash_gpio_status(debug, memory_mapping);
} else if (argc == 2 && !strcmp("gpl1", argv[1])) {
- return dump_gpio_bank_status(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpl1");
+ return dump_gpio_bank_status(debug, memory_mapping, "gpl1");
} else if (argc == 2 && !strcmp("gpl2", argv[1])) {
- return dump_gpio_bank_status(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpl2");
+ return dump_gpio_bank_status(debug, memory_mapping, "gpl2");
} else if (argc == 2 && !strcmp("gps", argv[1])) {
- return dump_flash_gps_status(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr);
+ return dump_flash_gps_status(debug, memory_mapping);
} else if (argc == 2 && !strcmp("gpy0", argv[1])) {
- return dump_gpio_bank_status(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr, "gpy0");
+ return dump_gpio_bank_status(debug, memory_mapping, "gpy0");
} else if (argc == 2 && !strcmp("modem", argv[1])) {
- return dump_modem_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr);
+ return dump_modem_gpio_infos(debug, memory_mapping);
} else if (argc == 2 && !strcmp("test", argv[1])) {
- return run_tests(debug, devmem, fd, page_size, gpio_hardware_blocks_addr);
+ return run_tests(debug, memory_mapping);
} else {
usage(argv[0]);
return EX_USAGE;
}
-end:
- rc = close(fd);
- if (rc == -1) {
- rc = errno;
- printf("Closing %s failed with error %d: %s\n",
- devmem, rc, strerror(rc));
- /* TODO: return more precise error */
+ rc = exit_memory_mapping(debug, memory_mapping);
+ if (rc == -1) {
+ printf("%s: exit_memory_mapping failed with error %d\n",
+ __func__, rc);
return EX_UNAVAILABLE;
}
diff --git a/memory.c b/memory.c
index d05cee2..a162b1d 100644
--- a/memory.c
+++ b/memory.c
@@ -15,10 +15,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -27,30 +29,55 @@
#include "memory.h"
+struct gpio_block {
+ off_t mmap_phys_base;
+ off_t *mmap_virt_base;
+ off_t mmap_length;
+};
+
struct memory_mapping {
- unsigned int *mmap_phys_base;
- unsigned int *mmap_virt_base;
- unsigned int mmap_length;
+ struct gpio_block gpio_left;
+ struct gpio_block gpio_right;
};
-static bool addr_is_valid(struct memory_mapping *memory_mapping,
- unsigned int *addr)
+static bool addr_is_gpioleft(struct memory_mapping *memory_mapping, off_t addr)
+{
+ if (addr < memory_mapping->gpio_left.mmap_phys_base)
+ return false;
+
+ if (addr > (memory_mapping->gpio_left.mmap_phys_base +
+ memory_mapping->gpio_left.mmap_length))
+ return false;
+
+ return true;
+}
+
+static bool addr_is_gpioright(struct memory_mapping *memory_mapping, off_t addr)
{
- if (addr < memory_mapping->mmap_phys_base)
+ if (addr < memory_mapping->gpio_right.mmap_phys_base)
return false;
- if (addr > (memory_mapping->mmap_phys_base + memory_mapping->mmap_length))
+ if (addr > (memory_mapping->gpio_right.mmap_phys_base +
+ memory_mapping->gpio_right.mmap_length))
return false;
return true;
}
-int init_memory_mapping(int debug, struct memory_mapping *memory_mapping,
- off_t addr, size_t length)
+int init_memory_mapping(int debug, struct memory_mapping **memory_mapping_pp)
{
int fd;
int rc;
char *devmem = "/dev/mem";
+ struct memory_mapping *memory_mapping;
+
+ memory_mapping = malloc(sizeof(struct memory_mapping));
+ if (memory_mapping == NULL) {
+ rc = errno;
+ printf("%s: malloc failed with error %d: %s\n",
+ __func__, rc, strerror(rc));
+ return -1;
+ }
fd = open(devmem, O_RDWR | O_SYNC);
if (fd == -1) {
@@ -60,15 +87,40 @@ int init_memory_mapping(int debug, struct memory_mapping *memory_mapping,
return -1;
}
- memory_mapping->mmap_virt_base = mmap(0, length, PROT_READ|PROT_WRITE,
- MAP_SHARED, fd, addr);
- if (memory_mapping->mmap_virt_base == MAP_FAILED) {
+ memory_mapping->gpio_right.mmap_phys_base = 0x11000000UL;
+ memory_mapping->gpio_right.mmap_length = 0x400000UL;
+
+ memory_mapping->gpio_right.mmap_virt_base = mmap(
+ 0,
+ memory_mapping->gpio_right.mmap_length,
+ PROT_READ|PROT_WRITE,
+ MAP_SHARED, fd,
+ memory_mapping->gpio_right.mmap_phys_base);
+
+ if (memory_mapping->gpio_right.mmap_virt_base == MAP_FAILED) {
rc = errno;
printf("%s: mmap on %s failed with error %d: %s\n",
__func__, devmem, rc, strerror(rc));
return -1;
}
+ memory_mapping->gpio_left.mmap_phys_base = 0x11400000UL;
+ memory_mapping->gpio_left.mmap_length = 0x400000UL;
+
+ memory_mapping->gpio_left.mmap_virt_base = mmap(
+ 0,
+ memory_mapping->gpio_left.mmap_length,
+ PROT_READ|PROT_WRITE,
+ MAP_SHARED, fd,
+ memory_mapping->gpio_left.mmap_phys_base);
+
+ if (memory_mapping->gpio_left.mmap_virt_base == MAP_FAILED) {
+ rc = errno;
+ printf("%s: mmap on %s failed with error %d: %s\n",
+ __func__, devmem, rc, strerror(rc));
+ return -1;
+ }
+
rc = close(fd);
if (rc == -1) {
rc = errno;
@@ -77,28 +129,101 @@ int init_memory_mapping(int debug, struct memory_mapping *memory_mapping,
return -1;
}
- if (debug)
- printf("%s: mapped address 0 @ %p\n", __func__,
- memory_mapping->mmap_virt_base);
+ *memory_mapping_pp = memory_mapping;
+
+ if (debug) {
+ printf("%s: %s(%p) mapped at %p. Length: %p\n",
+ __func__,
+ "gpio_right",
+ (void*)memory_mapping->gpio_right.mmap_phys_base,
+ (void*)memory_mapping->gpio_right.mmap_virt_base,
+ (void*)memory_mapping->gpio_right.mmap_length);
+ printf("%s: %s(%p) mapped at %p. Length: %p\n",
+ __func__,
+ "gpio_left",
+ (void*)memory_mapping->gpio_left.mmap_phys_base,
+ (void*)memory_mapping->gpio_left.mmap_virt_base,
+ (void*)memory_mapping->gpio_left.mmap_length);
+ }
+ return 0;
+}
+
+
+int exit_memory_mapping(int debug, struct memory_mapping *memory_mapping)
+{
+ int rc;
+
+ rc = munmap(memory_mapping->gpio_right.mmap_virt_base,
+ memory_mapping->gpio_right.mmap_length);
+ if (rc == -1) {
+ rc = errno;
+ printf("%s: munmap of %s failed with error %d: %s\n",
+ __func__, "gpio_right", rc, strerror(rc));
+ return -1;
+ }
+
+ rc = munmap(memory_mapping->gpio_left.mmap_virt_base,
+ memory_mapping->gpio_left.mmap_length);
+ if (rc == -1) {
+ rc = errno;
+ printf("%s: munmap of %s failed with error %d: %s\n",
+ __func__, "gpio_left", rc, strerror(rc));
+ return -1;
+ }
+
+ free(memory_mapping);
return 0;
}
-int read_word(int debug, struct memory_mapping *memory_mapping,
- unsigned int addr, unsigned int *result)
+off_t *phys_to_virt(int debug, struct memory_mapping *memory_mapping, off_t phys_addr)
{
- unsigned int *virt_addr;
+ off_t offset = 0;
+
+ if (addr_is_gpioleft(memory_mapping, phys_addr)) {
+ /* we mmap with mmap_phys_base as offset, and the resulting
+ * virtual address points directly at mmap_phys_base
+ */
+ offset = phys_addr - memory_mapping->gpio_left.mmap_phys_base;
+
+ if (debug)
+ printf("%s: addrress %p is valid. Offset: %p\n",
+ __func__, (void*)phys_addr, (void*)offset);
+
+ return memory_mapping->gpio_left.mmap_virt_base + offset;
+ } else if (addr_is_gpioright(memory_mapping, phys_addr)) {
+ /* we mmap with mmap_phys_base as offset, and the resulting
+ * virtual address points directly at mmap_phys_base
+ */
+ offset = phys_addr - memory_mapping->gpio_right.mmap_phys_base;
+
+ if (debug)
+ printf("%s: addrress %p is valid. Offset: %p\n",
+ __func__, (void*)phys_addr, (void*)offset);
+
+ return memory_mapping->gpio_right.mmap_virt_base + offset;
+ } else {
+ printf("%s: failed: invalid address %p\n",
+ __func__, (void*)phys_addr);
+ errno = EDOM;
+ return 0;
+ }
+}
- if (!addr_is_valid(memory_mapping, (unsigned int *)addr))
- return -EDOM;
+int read_word(int debug, struct memory_mapping *memory_mapping,
+ off_t addr, unsigned int *result)
+{
+ off_t *virt_addr;
- virt_addr = memory_mapping->mmap_virt_base + addr;
+ virt_addr = phys_to_virt(debug, memory_mapping, addr);
+ if (virt_addr == NULL)
+ return -1;
*result = *virt_addr;
if (debug)
- printf("%s: debug=%d, addr=0x%x, result=0x%x\n",
- __func__, debug, addr, *result);
+ printf("%s: addr=0x%llx, result=0x%x\n",
+ __func__, (long long int)addr, *result);
return 0;
}
diff --git a/memory.h b/memory.h
index 5a03e4d..5ba91bf 100644
--- a/memory.h
+++ b/memory.h
@@ -20,9 +20,10 @@
struct memory_mapping;
-int init_memory_mapping(int debug, struct memory_mapping *memory_mapping,
- off_t addr, size_t length);
+int init_memory_mapping(int debug, struct memory_mapping **memory_mapping_pp);
+int exit_memory_mapping(int debug, struct memory_mapping *memory_mapping);
+
int read_word(int debug, struct memory_mapping *memory_mapping,
- unsigned int addr, unsigned int *result);
+ off_t addr, unsigned int *result);
#endif /* MEMORY_H */
diff --git a/modem_gpios_data.c b/modem_gpios_data.c
index 208f11f..c14dece 100644
--- a/modem_gpios_data.c
+++ b/modem_gpios_data.c
@@ -21,6 +21,7 @@
#include <sysexits.h>
#include "exynos4412_gpios.h"
+#include "memory.h"
#include "modem_gpios_data.h"
struct modem_gpio_data modem_gpio_datas[] = {
@@ -126,9 +127,8 @@ struct modem_gpio_data *get_modem_gpio_data_by_dt_name(char *dt_name)
return NULL;
}
-int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd,
- size_t page_size,
- void *gpio_hardware_blocks_addr,
+int dump_modem_gpio_infos_by_dt_name(int debug,
+ struct memory_mapping *memory_mapping,
char *dt_name)
{
struct modem_gpio_data *modem_gpio_data;
@@ -137,15 +137,13 @@ int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd,
if (modem_gpio_data == NULL)
return -1;
- return dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
+ return dump_gpio_infos(debug, memory_mapping,
modem_gpio_data->bank,
modem_gpio_data->gpio_offset);
}
-int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr)
+int dump_modem_gpio_infos(int debug, struct memory_mapping *memory_mapping)
{
int i = 0;
@@ -158,8 +156,7 @@ int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size,
printf("%s: dump_gpio_infos: %s\n",
__func__, modem_gpio_datas[i].dt_gpio_name);
- rc = dump_gpio_infos(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
+ rc = dump_gpio_infos(debug, memory_mapping,
modem_gpio_datas[i].bank,
modem_gpio_datas[i].gpio_offset);
diff --git a/modem_gpios_data.h b/modem_gpios_data.h
index 0e8a3dd..18f34bf 100644
--- a/modem_gpios_data.h
+++ b/modem_gpios_data.h
@@ -31,11 +31,8 @@ struct modem_gpio_data {
char *dt_gpio_name;
};
-int dump_modem_gpio_infos(int debug, char* devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr);
-int dump_modem_gpio_infos_by_dt_name(int debug, char *devmem, int fd,
- size_t page_size,
- void *gpio_hardware_blocks_addr,
+int dump_modem_gpio_infos(int debug, struct memory_mapping *memory_mapping);
+int dump_modem_gpio_infos_by_dt_name(int debug, struct memory_mapping *memory_mapping,
char *dt_name);
#endif /* MODEM_GPIOS_DATA_H */
diff --git a/tests.c b/tests.c
index a5990bd..c3bb37b 100644
--- a/tests.c
+++ b/tests.c
@@ -29,6 +29,7 @@
#include "exynos4412_gpios.h"
#include "exynos4412_gpios_data.h"
+#include "memory.h"
#include "tests.h"
static int run_command(int debug, char *command)
@@ -59,9 +60,8 @@ static int run_command(int debug, char *command)
}
}
-static int test_output_value_with_libgpiod(int debug, char *devmem, int fd,
- size_t page_size,
- void *gpio_hardware_blocks_addr,
+static int test_output_value_with_libgpiod(int debug,
+ struct memory_mapping *memory_mapping,
char *bank, int gpio_offset)
{
char *gpioset_high_command;
@@ -83,13 +83,9 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd,
free(gpioset_high_command);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_OUTPUT);
- rc = gpio_get_output_value(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_output_value(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_VALUE_HIGH);
rc = asprintf(&gpioset_low_command, "gpioset %s %d=0", bank,
@@ -104,14 +100,10 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd,
rc = run_command(debug, gpioset_low_command);
assert(rc == 0);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_OUTPUT);
- rc = gpio_get_output_value(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_output_value(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_VALUE_LOW);
free(gpioset_low_command);
@@ -119,9 +111,8 @@ static int test_output_value_with_libgpiod(int debug, char *devmem, int fd,
return 0;
}
-static int test_flash_with_devmem2(int debug, char *devmem, int fd,
- size_t page_size,
- void *gpio_hardware_blocks_addr)
+static int test_flash_with_devmem2(int debug,
+ struct memory_mapping *memory_mapping)
{
int rc;
@@ -141,9 +132,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
/* GPJ1CON[4:7] with bit 4 to 7 at 0 => 0xnn0n (n == don't care) */
rc = run_command(debug, "devmem2 0x11400260 w 0x2000");
assert(rc == 0);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ rc = gpio_get_direction(debug, memory_mapping, "gpj1", 1);
assert (rc == GPIO_INPUT);
printf("[ OK ] devmem2 GPIO input test\n");
@@ -153,9 +142,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
/* GPJ1CON[4:7] with bit 1 @ 1 and the rest at 0 => 1<<5 == 0x20 */
rc = run_command(debug, "devmem2 0x11400260 w 0x2020");
assert(rc == 0);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ rc = gpio_get_direction(debug, memory_mapping, "gpj1", 1);
assert (rc == GPIO_OUTPUT);
printf("[ OK ] devmem2 GPIO output test\n");
@@ -165,9 +152,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
printf(" Starting devmem2 GPIO output low test\n");
rc = run_command(debug, "devmem2 0x11400264 w 0");
assert(rc == 0);
- rc = gpio_get_output_value(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1);
assert (rc == GPIO_VALUE_LOW);
printf("[ OK ] devmem2 GPIO output low test\n");
@@ -177,9 +162,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
printf(" Starting devmem2 GPIO output high test\n");
rc = run_command(debug, "devmem2 0x11400264 w 2");
assert(rc == 0);
- rc = gpio_get_output_value(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1);
assert (rc == GPIO_VALUE_HIGH);
printf("[ OK ] devmem2 GPIO output high test\n");
@@ -189,9 +172,7 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
printf(" Starting devmem2 GPIO output low test\n");
rc = run_command(debug, "devmem2 0x11400264 w 0");
assert(rc == 0);
- rc = gpio_get_output_value(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ rc = gpio_get_output_value(debug, memory_mapping, "gpj1", 1);
assert (rc == GPIO_VALUE_LOW);
printf("[ OK ] devmem2 GPIO output low test\n");
@@ -199,9 +180,8 @@ static int test_flash_with_devmem2(int debug, char *devmem, int fd,
}
-static int test_direction_with_libgpiod(int debug, char *devmem, int fd,
- size_t page_size,
- void *gpio_hardware_blocks_addr,
+static int test_direction_with_libgpiod(int debug,
+ struct memory_mapping *memory_mapping,
char *bank, int gpio_offset)
{
char *gpioget_command;
@@ -222,9 +202,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd,
free(gpioget_command);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_INPUT);
rc = asprintf(&gpioset_command, "gpioset %s %d=1", bank,
@@ -239,9 +217,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd,
rc = run_command(debug, gpioset_command);
assert(rc == 0);
- rc = gpio_get_direction(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- bank, gpio_offset);
+ rc = gpio_get_direction(debug, memory_mapping, bank, gpio_offset);
assert (rc == GPIO_OUTPUT);
free(gpioset_command);
@@ -249,8 +225,7 @@ static int test_direction_with_libgpiod(int debug, char *devmem, int fd,
return 0;
}
-int run_tests(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr)
+int run_tests(int debug, struct memory_mapping *memory_mapping)
{
bool has_devmem2;
bool has_gpioget;
@@ -261,14 +236,10 @@ int run_tests(int debug, char *devmem, int fd, size_t page_size,
has_gpioset = device_has_gpioset(debug);
if (has_gpioget && has_gpioset) {
- test_direction_with_libgpiod(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ test_direction_with_libgpiod(debug, memory_mapping, "gpj1", 1);
printf("[ OK ] libgpiod GPIO direction test\n");
- test_output_value_with_libgpiod(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr,
- "gpj1", 1);
+ test_output_value_with_libgpiod(debug, memory_mapping, "gpj1", 1);
printf("[ OK ] libgpiod GPIO output value test\n");
} else {
if (!has_gpioget)
@@ -281,8 +252,7 @@ int run_tests(int debug, char *devmem, int fd, size_t page_size,
}
if (has_devmem2) {
- test_flash_with_devmem2(debug, devmem, fd, page_size,
- gpio_hardware_blocks_addr);
+ test_flash_with_devmem2(debug, memory_mapping);
} else {
printf("[ !! ] devmem2 not found: skipping"
" devmem2 direction and output tests\n");
diff --git a/tests.h b/tests.h
index b98ec4a..450ca5e 100644
--- a/tests.h
+++ b/tests.h
@@ -20,7 +20,8 @@
#include <stddef.h>
-int run_tests(int debug, char *devmem, int fd, size_t page_size,
- void *gpio_hardware_blocks_addr);
+#include "memory.h"
+
+int run_tests(int debug, struct memory_mapping *memory_mapping);
#endif /* TESTS_H */